Floating point 整数*浮点精度

Floating point 整数*浮点精度,floating-point,floating-accuracy,Floating Point,Floating Accuracy,我知道数字表示法之间的区别,但我想有人来解释一下。 我们看到float t的值是这样的,我想知道为什么f不等于2+t(数学上应该是这样的),但是有一点,一点误差[对我来说,它实际上相当大!] 这个错误是由int*浮点乘法引起的吗 这是因为浮点中存在浮点错误。由于浮点数只能包含一定数量的二进制数字,它们不可能完全准确,因此在使用浮点数进行计算时,得到的数字不太准确。通常,整数类型的值与浮点类型的值的加法或乘法是通过首先将整数转换为浮点,然后执行算术运算来执行的。如果整数值不能以浮点格式精确表示,则

我知道数字表示法之间的区别,但我想有人来解释一下。 我们看到float t的值是这样的,我想知道为什么f不等于2+t(数学上应该是这样的),但是有一点,一点误差[对我来说,它实际上相当大!]

这个错误是由int*浮点乘法引起的吗


这是因为浮点中存在浮点错误。由于浮点数只能包含一定数量的二进制数字,它们不可能完全准确,因此在使用浮点数进行计算时,得到的数字不太准确。

通常,整数类型的值与浮点类型的值的加法或乘法是通过首先将整数转换为浮点,然后执行算术运算来执行的。如果整数值不能以浮点格式精确表示,则即使在执行操作之前也会引入错误。对于示例中的小整数,这不是问题

如果精确的数学结果不能用浮点类型表示,则算术运算将引入错误。有两种方式可能无法代表结果:

  • 一种是,表示有效位(分数部分)所需的位数(或通常不使用二进制浮点时的位数)不适合浮点格式
  • 另一个原因是结果的大小超出了浮点格式的范围,导致溢出或下溢
你的例子不接近溢出或下溢发生的程度,所以我这里不讨论它们

假设您使用的是IEEE-754 32位二进制浮点,它通常用于C实现中的
float
,有效位是24位。因此,每当您执行一个结果需要超过24位来表示的操作时,您都会得到一个错误。该24位跨度从数字中的最高设定位到其最低设定位进行测量

例如,1111.111111112需要24位来表示。如果将100002加上,精确的数学结果是11111.111111111112。这需要25位,因此它不适合,因此浮点实现必须将精确的数学结果四舍五入为可表示的结果。(在具有此特定值的“常用四舍五入到最近”模式中,它将低位向上四舍五入,导致所有位的进位,产生1000002。)

现在,您可以了解哪些操作将出现错误。如果你加上两个不同大小的数字,较小数字的一些低位将被“挤出”结果。如果这些位中的任何一位不为零,则信息丢失,发生错误。此外,结果可能会跨越二次方边界,其中其最高位高于任一输入值的最高位。这会将另一位移出有效位。例如,如果我们将1000加到1111.111111112,精确的数学结果是10111.111111111112。这需要25位,因此低位被舍入,产生110002

假设有两个数字的有效位需要a和b位。将它们相乘时,精确的数学结果需要a+b–1或a+b位,这取决于是否存在产生新高位的“进位”。例如,112•1112=101012,两位乘以三位产生五位。或1.0012•1.012=1.011012,四位乘以三位产生六位。所以整数相乘会产生舍入误差


用二的幂相乘不会以这种方式产生舍入误差,尽管它会导致溢出或下溢。

是的,当然可以,但是你能对float+int怎么说?这个总是精确的?float+int和float一样精确。例如,如果你有一个2.4的浮点值和一个1的整数,加上它们将始终是3.4,但是如果你的浮点值应该是2.4,实际上是2.39999(因为你是通过一些计算得到的),结果将是3.3999。只有当除法/乘法的结果在小数点后有许多位数时,才会出现浮点错误。恐怕这不是真的。你是对的。如果浮点曾经、曾经或是从一个有十进制值的数字计算出来的结果,则很容易出现此错误。@cf16 Try 3.3。在Java中,我在添加一个之前得到了3.299999523162841796875,在添加一个之后得到了4.30000019073486328125。为什么是浮点而不是双精度?帕特里夏故意问这个问题,因为使用浮点而不是双精度的正常问题是无法接受的大舍入误差,而您的评论“对我来说,事实上它是相当大的!”表明了这种情况。另外,安全地使用float通常需要非常仔细的数值分析,问题表明还没有这样做。那么,在处理数字和计算时,我们应该做些什么才能达到最佳精度?@cf16:这是一个开放性的问题。有很多关于使用浮点运算的文献。最佳做法取决于背景;针对具体情况,有各种技术。通常,非常粗略地说,
double
与现代处理器上的
float
在不进行大量计算时的成本大致相同,因此对大多数浮点运算使用
double
。学习浮点运算,了解它是如何工作的以及发生了什么错误。