这更多的是一个数值分析而不是编程问题,但我想你们中的一些人能够回答它。

两个浮点数相加,是否有精度损失?为什么?

在浮点数和整数之和中,是否有精度损失?为什么?

谢谢。

有帮助吗?

解决方案

  

在总和两个浮体,是否有丢失的任何精度?

如果两个浮筒有不同的大小和两者都使用完整的精度范围(约7小数位),然后是的,你会看到在过去的地方一定的损失。

  

为什么?

这是因为浮筒被存储在的(符号)的形式(尾数)×2 (指数)。如果两个值具有不同的指数,你加他们,那么较小的值会得到尾数减少到数字(因为它必须适应大的指数):

PS> [float]([float]0.0000001 + [float]1)
1
  

在浮子和一整数的总和,是有丢失的任何精度?

是,通常的32位整数是能够精确地表示值不适合完全成浮动。一个浮点仍然可以存储相同的号码,但不再准确。当然,这仅适用于有足够大的,我的数字。即长于24位。

  

为什么?

由于浮子具有的精度24位和(32位)整数具有32.浮法将仍然能够保留大小和大部分显著位,但最后的地方可能会有所不同:

PS> [float]2100000050 + [float]100
2100000100

其他提示

精度取决于原始数字的大小。在浮点中,计算机代表数字312内部作为科学记数法:

3.12000000000 * 10 ^ 2

在左手侧(尾数)的小数位是固定的。指数也具有上界和下界。这允许它代表非常大的或非常小的数字。

如果您尝试添加两个数字哪个是大小相等,其结果应保持在精密一样,因为小数点不必移动:

312.0 + 643.0 <==>

3.12000000000 * 10 ^ 2 +
6.43000000000 * 10 ^ 2
-----------------------
9.55000000000 * 10 ^ 2

如果你想添加一个非常大和非常小的数字,你会因为他们的失去精度必须挤进以上格式。考虑312 + 12300000000000000000000.首先,必须是按比例的较小的数目与大排队,然后添加:

1.23000000000 * 10 ^ 15 +
0.00000000003 * 10 ^ 15
-----------------------
1.23000000003 <-- precision lost here!

浮点可以处理非常大,或者非常小的数。但它不能在同一时间同时表示。

至于整数和双打被加入时,int获取立即变成双,那么上述适用。

float可用的精度是有限的,当然这样总是存在任何给定的操作精度下降的危险。

为您的问题的答案是“是”。

如果您尝试添加一个非常大的浮动,以一个非常小的一个,你会为实例有问题。

或者,如果你尝试将整数添加到浮动,其中整数使用更多的比特比浮动有可供其尾数。

简短的回答:计算机表示具有有限位数的浮点数,这通常是用 尾数和指数, ,所以只用了几个字节作为有效数字,其余的用来表示小数点的位置。

如果您尝试将(例如)10^23 和 7 相加,那么它将无法准确表示该结果。当浮点数和整数相加时,也适用类似的论点——整数将被提升为浮点数。

  

在总和两个浮体,是否有任何丢失精度?   在浮点和整数一个的总和,有没有精密失去了什么?为什么呢?

不总是如此。如果总和表示的配合精度你问,你不会得到任何精度损失。

实施例:0.5 + 0.75 =>无精度损失          X * 0.5 =>无精度损失(除了如果x太大小)

在一般情况下,一个附加所以实际上依赖于舍入模式中的精度损失漂浮在略有不同的范围。 即:如果你有完全不同的范围内添加数字,预计精度问题

反向规格在这里,得到额外的精度在极端情况下,在CPU为代价的。

根据如何编译器处理浮点运算,结果可能会有所不同。

使用严格IEEE语义,加入两个32比特漂浮不应给出更好的精度大于32位。 在实践中,可能需要更多的指令,以确保,所以你不应该依赖于精确和可重复的结果与浮点。

在这两种情况下是:

assert( 1E+36f + 1.0f == 1E+36f );
assert( 1E+36f + 1 == 1E+36f );

在壳体浮动+ int是相同浮子+浮动,因为一个标准转换施加到INT。在浮浮+的情况下,这是实现相关的,因为一个实现可以选择做加法,在双精度。可能有一些损失,当你存储过程的结果。

在这两种情况下,答案是“是”。当添加intfloat,添加发生反正之前整数转换为浮点表示。

要了解原因,我建议你阅读这种宝石:什么每台计算机科学家应该知道关于浮点运算

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top