我正在尝试将minpack
Fortran77库重写为Java(根据我自己的需要),所以我在minpack.f
源代码中遇到了这个:
integer mcheps(4)
integer minmag(4)
integer maxmag(4)
double precision dmach(3)
equivalence (dmach(1),mcheps(1))
equivalence (dmach(2),minmag(1))
equivalence (dmach(3),maxmag(1))
...
data dmach(1) /2.22044604926d-16/
data dmach(2) /2.22507385852d-308/
data dmach(3) /1.79769313485d+308/
dpmpar = dmach(i)
return
minmag
和maxmag
函数是什么,为什么dmach(2)
和dmach(3)
具有这些值?
评论中有一个解释:
c dpmpar(1) = b**(1 - t), the machine precision,
c dpmpar(2) = b**(emin - 1), the smallest magnitude,
c dpmpar(3) = b**emax*(1 - b**(-t)), the largest magnitude.
最小和最大幅度是多少?必须有一种方法可以在运行时计算这些值;源代码中的机器常量是一种糟糕的风格。
编辑:
我认为静态字段Double.MIN_VALUE
和Double.MAX_VALUE
是我查找的值。
答案 0 :(得分:1)
minmag
和maxmag
(以及mcheps
)不是函数,它们被声明为1级整数数组,每个数组包含4个元素。同样,dmach
是具有双精度值的rank 1 3元素数组。很可能,但不确定,每个整数值占用4个字节,每个d-p值占8个字节。随着答案的进展,请记住这一点。
因此mcheps(1)
之类的表达式不是函数调用,而是对数组第1个元素的引用。
equivalence
是旧的FORTRAN功能,现在已被语言标准和软件工程实践所弃用。诸如
equivalence (dmach(1),mcheps(1))
指出dmach
的第一个元素在内存中位于与mcheps
的第一个元素相同的地址。通过暗示,这也意味着dmach
的24个字节占用与mcheps
的16个字节相同的地址,并且另外8个字节。我会告诉你画一幅正在发生的事情。请注意,可以想象代码最初(可能仍然)使用8字节整数,以使等价数组的元素匹配1:1。
请注意,equivalence
基本上为同一个内存位置提供了多个名称和多个解释。 mcheps(1)
是存储在4字节内存中的整数的名称,它构成dmach(1)
存储的一部分。在每个字节都很珍贵的日子里,等效过去常用于实现各种“聪明”的技巧。
然后data
语句为dmach
的元素赋值。对我来说,这些价值看起来就像评论告诉我们的那样。
编辑:注释表明这些幅度是上次编译代码的平台上最小和最大可表示的双精度数。我认为在Java中它们可能被称为doubles
。我不知道Java,所以不知道它有什么设施可以返回最大和最小的双倍的值,如果你不知道这要么打到'网或问另一个SO问题 - 你会可能会按照搜索网的方式获得回复。
大多数情况下你应该可以完全忽略。在编写时,更好的方法是通过使用内部函数的查询在运行时找出这些值。 Fortran 90(及更高版本)有这样的功能,我想Java也有,但那是你的域而不是我的。