Java双精度数学计算

3

我正在对一款流行游戏(Minecraft)进行一些修改,我在地形生成代码中发现了以下这几行:

double d4 = 1.0D;
d4 *= d4; 
d4 *= d4;
d4 = 1.0D - d4;
double d5 = (noise1[l1] + 256D) / 512D;
d5 *= d4;

我想知道d4的作用是什么,因为在第四行它总是0,不是吗?


@pst:不,1.0d * 1.0d 确切地等于 1.0d,因为1.0d在二进制浮点数中可以精确表示。(与此相比,0.1d是无法精确表示的。) - Jon Skeet
@pst:在浮点数学中,为什么1.0*1.0会不是1.0呢? - Oliver Charlesworth
根据这段代码,yes和d5也将为零。 - CoolBeans
我不知道它在哪里被使用,但对我来说,d4似乎是某个图形参数。第二和第三行负责制作a^4。第四行是这个值的否定。如果将d4设置为类似0.9的值,则结果看起来相当不错。 - Mateusz Chromiński
1个回答

5

是的,在纯Java中,这至少可以保证是0。

尽管浮点二进制算术有其不准确性,但1.0本身可以被精确地表示,并且将其乘以自身得到的结果始终会回到1.0。

你确定没有其他事情在其他地方使它与1.0d略有不同吗?或者它历史上可能是0.1以外的某个值?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接