我正在使用SLATEC库中提供的修改过的Bessel函数dbesi0.f。
它包含声明:
DATA BI0CS( 1) / -.7660547252 8391449510 8189497624 3285 D-1 /
填充双精度BIOCS向量的第一个元素。
我从未见过包含空格的双精度常量。 编译器没有标记这个,所以我认为它是正确的。然而, ???双精度矢量应该只能处理15或16位数 那么34位数是怎么回事?是否有人使用128位数字?如果一台机器使用64位双精度数,编译器是否只关注DATA语句中的前xx数字?如果是这样,什么是xx?为什么没有因空格而返回错误?
答案 0 :(得分:1)
请注意,该文件是固定格式的源代码。在语句中的固定格式源空间(字符文字中的空格除外)和语句标签不重要。语句和语句标签只需要包含在正确的列范围内。编写固定表单源的人可以添加和删除字符常量之外的空格,以便根据内容的内容来阐明或混淆代码。
(因此设计Fortran源的语法使得编译器可以解析代码而不考虑空格 - 例如,示例代码段开头的DATA
和BI0CS
之间的空格可能是消除,使它成为DATABI0CS
,或者如果你有穿孔卡片可以写成D A T A B I 0 C S
。这种源形式功能通常不被认为是好事,尽管它确实派上用场了按照你的例子对常量中的数字进行分组。)
Fortran处理器通常会使用最接近双精度文字常量的内部近似值。这不仅仅是忽略十进制数字的情况,因为当处理器的实数模型的基数不是10时,尾随十进制数仍然会影响哪个特定内部值最接近。
在源代码中提供比Fortran处理器可以使用的内容更高的精度,这是一种证明代码的形式,可用于具有更高数值精度的处理器。
(该真实文字常量的最后几位使我怀疑它是一个二进制数字的某个有意义的数字(可能是64)的精确值,但我没有检查过。)
答案 1 :(得分:0)
Fortran-77 language specification州:
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位数。除了允许增加double类型的字节数的编译器选项之外,作者可能已包含较长的字符串以供参考,或者使用SELECTED_REAL_KIND
简化将来创建更高精度的版本。