在我的计算机科学课程中,我们正在研究浮点数以及它们在内存中是如何表示的。我已经理解了它们在内存中是如何表示的(尾数/有效数、指数及其偏差、符号位),我也理解了浮点是如何相互添加和减去的(反规格化和所有那些有趣的东西)。然而,在翻阅一些学习问题时,我注意到一些我无法解释的东西。
当一个不能精确表示的浮点数加到自己身上几次时,答案比我们在数学上预期的要低,但当同一个浮点数乘以一个整数时,答案就精确地得出了正确的数字。
下面是我们的学习问题中的一个例子(这个例子是用Java编写的,为了简单起见我把它编辑下来了):
float max = 10.0f; /* Defined outside the function in the original code */
float min = 1.0f; /* Defined outside the function in the original code */
int count = 10; /* Passed to the function in the original code */
float width = (max - min) / count;
float p = min + (width * count);
float max = 10.0f; /* Defined outside the function in the original code */
float min = 1.0f; /* Defined outside the function in the original code */
int count = 10; /* Passed to the function in the original code */
float width = (max - min) / count;
for(float p=min; p <= max; p += width){
System.out.printf("%f%n", p);
}
但是,我不明白的是,为什么第一个例子得到的是10.0。从数学上讲,我们得到10.0是有意义的,但是知道浮点是如何存储在内存中的,这对我来说是没有意义的。谁能解释一下为什么我们用一个int乘以一个不精确的float来得到一个精确的值吗?
编辑:为了澄清,在最初的研究问题中,一些值被传递给函数,而其他值则在函数之外声明。我的示例代码是学习问题示例的缩短和简化版本。因为有些值被传递到函数中,而不是显式地定义为常量,所以我相信可以排除在编译时进行简化/优化。
由于1.0+((10.0-1.0)/10.0)*10.0
只执行1次不精确值的计算,因此有1次舍入误差,因此它比对浮点数的0.9f表示进行10次加法更精确。我认为这就是本例中要教授的校长。
关键问题是0.1不能用浮点精确表示。所以0.9有错误,在函数循环中加起来。
“确切”的数字,可能是因为一个巧妙的输出格式化例程才显示出来的。当我第一次使用电脑的时候,他们喜欢把这样的数字以一种荒谬的科学固定数字格式输出,这对人类并不友好。
问题内容: $a = ‘35’; $b = ‘-34.99’; echo ($a + $b); 结果为0.009999999999998 这是怎么回事?我想知道为什么我的程序不断报告奇怪的结果。 为什么PHP不返回预期的0.01? 问题答案: 因为浮点运算!=实数运算。对于一些浮子和,由不精确性引起的差异的说明是。这适用于使用浮点数的任何语言。 由于浮点数是具有有限精度的二进制数,因此存在有限数量
本文向大家介绍Fortran 浮点数精度,包括了Fortran 浮点数精度的使用技巧和注意事项,需要的朋友参考一下 示例 类型的浮点数real不能有任何实数值。它们可以表示实数,最多可以包含一定数量的十进制数字。 FORTRAN 77保证了两种浮点类型,而最新的标准则至少保证了两种实数类型。实变量可以声明为 x这是默认类型的实数,并且y是比更大的十进制精度的实数x。在Fortran 2008中,十
谢谢
我编写了一个程序来演示Go中的浮点错误: 它打印: 这与用C编写的相同程序的行为相匹配(使用双代码类型) 但是,如果改用,程序就会陷入无限循环!如果将C程序修改为使用而不是,它将打印 为什么在使用时,Go程序的输出与C程序的输出不一样?
问题内容: 我有这个问题,我必须将公里转换成英里。我是一个新手程序员,所以请耐心等待。 到目前为止,这是我的代码: 它给我一个错误,说: 问题答案: 您正在尝试将a 设置为变量 要修复,请更改此行 至
我有一个问题,我必须把公里转换成英里。我是一个新手程序员,所以请原谅我。 这是我到目前为止的代码: 它给我一个错误提示: