为了演示 Jonathan 的答案,如果您在 C 中编写相同的循环结构,您将得到相同的结果。尽管 C 和 Perl 的编译方式可能不同并且在不同的机器上运行,但底层的浮点算术规则应该会产生一致的输出。注意:Perl 使用双精度浮点作为其浮点表示,而在 C 中,编码器显式选择 float 或 double。
在 C 中循环:
#include <stdio.h>
int main() {
double i;
for(i=0;i<=1;i+=.01) {
printf("%.15f\n",i);
}
}
输出:
0.790000000000000
0.800000000000000
0.810000000000000
0.820000000000001
0.830000000000001
0.840000000000001
0.850000000000001
为了进一步证明这一点,用 C 编写循环代码,但现在使用单精度浮点运算,并看到输出不太精确,甚至更不稳定。
输出:
0.000000000000000
0.009999999776483
0.019999999552965
0.029999999329448
0.039999999105930
0.050000000745058
0.060000002384186
0.070000000298023
0.079999998211861
0.089999996125698
0.099999994039536