数据语句中的 Fortran 双精度常量中的空格?



我正在使用SLATEC库中提供的修改后的贝塞尔函数dbesi0.f。

它包含以下语句:

DATA BI0CS(  1) / -.7660547252 8391449510 8189497624 3285 D-1   /

填充双精度 BIOCS 矢量的第一个元素。

我从未见过包含空格的双精度常数。 编译器不会标记这一点,所以我假设它是正确的。 然而 ??? 双精度向量只能处理 15 或 16 位数字 那么 34 位数字是怎么回事? 如果有人正在使用 128 位数字,是否提供这些? 如果机器使用 64 位双精度数字,编译器是否只关注 DATA 语句中的前 xx 位数字? 如果是这样,什么是 xx? 为什么没有由于空格而返回错误?

请注意,该文件是固定的表单源。 在固定格式中,语句中的源空格(不包括字符文本中的空格)和语句标签并不重要。 语句和语句标签只需要包含在列的右侧范围内。 编写固定表单源的人可以在字符文字常量之外添加和删除空格,以根据自己的喜好阐明或混淆代码。

(因此,Fortran 源代码的语法被设计为编译器可以在不考虑空格的情况下解析代码 - 例如,可以消除示例片段开头的DATABI0CS之间的空格,使其DATABI0CS,或者如果您有穿孔卡要烧掉它,它可以写D A T A B I 0 C S。 此源表单功能通常不被认为是一件好事,尽管根据您的示例,它确实可以派上用场,将常量中的数字分组。

Fortran 处理器通常会使用最接近双精度文字常量的内部近似值。 这不仅仅是忽略十进制数字的情况,因为当处理器的实数模型的基数不是 10 时,尾随的十进制数字仍然会影响哪个特定的内部值最接近。

在源中提供比 Fortran 处理器可以使用的内容更高的精度更高的精度是一种校对代码以用于具有更高数值精度的处理器的形式。

(该真实文字常量的最后几位让我怀疑它旨在成为某个有意义的二进制数字(可能是 64)的精确值,但我还没有检查过。

常量规范中的空白字符。

Fortran-77 语言规范指出:

4.2.2  Blanks_in_Constants.  Blank characters occurring
in  a constant, except in a character constant, have no
effect on the value of the constant.

请注意,这在 fortran 名称列表中不会是真的。

双精度型的精度位

某些编译器可以在编译时更改实数和双精度数据类型的精度。 例如,在 gFortran 4.6 中,如果可能的话,标志-fdefault-real-8会将双倍提升到 128 位。

https://gcc.gnu.org/onlinedocs/gfortran/Fortran-Dialect-Options.html

读取的位数

确切的行为可能取决于合规性,但应读取给定数据类型的最大有效位数。对于标准的 64 位双精度,仅使用前 15-17 位数字。 除了允许编译器选项增加双精度类型的字节数之外,作者可能还包含较长的字符串以供参考,或者简化将来使用SELECTED_REAL_KIND创建更高精度的版本。

最新更新