浮点除法不完善
Floating-point division imperfection
我知道浮点数不是完美的,要么是float
,要么是double
,但这是否意味着,当我用一个浮点数除以另一个浮点数时,红利可以被除数除而不提醒(如10000.0可以被10.0整除),我是否有可能得到一个数字。99999999…最终的结果只比正确的结果小一点点。这样的事情会发生在浮点数上吗?
我需要知道,因为我需要在除法之后应用floor
函数,如果浮点除法真的那么不完美,它将产生巨大的差异。
是否意味着,当我用一个浮点数除以另一个浮点数时,被除数可以在没有提醒的情况下被除数整除(比如10000.0可以被10.0整除),我有可能得到一个带有。99999999的数字…在结尾
。IEEE 754除法是正确四舍五入的。如果结果有一个可表示的浮点数(在您的示例中为1000),则这是您将得到的除法结果。
可能发生的情况是,您没有将您正在思考的数字除以,因为您写了0.1
,并且您认为这代表数学值0.1。在这种情况下,最终结果可能令人惊讶,但这不是浮点除法的错误。
只要你知道你在除法你想要的数字,如果除法的数学结果是,比如说,小于2的整数24,那么浮点除法的结果将是那个整数
假设硬件使用IEEE 754浮点除法,关键问题是自然数操作数是否完全可表示。
首先,格式具有有限的范围。自然数则不然。然而,即使32位二进制浮点数的限制,大约10^38,对于大多数实际用途来说也足够大了。
在这个范围内,归结为一个自然数是否可以表示为1.x*2^n
,其中n
为整数,1.x
为二进制分数,在二进制点后不超过23位。所有24位的自然数都满足这个条件。
一般来说,浮点数越大,指数越大,连续值之间的间隔也越大。直到24位自然数,间隙不大于1,所以所有的自然数都是可表示的。在下一步,差距是2,然后是4,然后是8……
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 我的神经网络不起作用 [XOR 问题]
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在除法中不需要四舍五入
- 而循环:简单的除法程序输出零,不明白为什么
- 余数除法和不允许除以零 (c++) 时遇到问题
- 不使用算术运算符的除法
- 为什么 g++ -O3 不将除法改为乘法?
- 通过递归计算模数而不使用模除法
- 创建乘积数组,它包含数组中所有元素的乘积,这些元素可以被A[i]整除,而不使用除法运算符
- 如何完善Dijkstra算法,而不是找到最佳路径
- 不带逻辑运算符的舍入整数除法
- C++除法不能给出正确的结果
- 为什么 std::atomic<integral> 专用化不提供乘法和除法赋值运算符?
- 求和1~N,不使用乘法、除法、if、while、for、switch和三元表达式
- 乘法、除法和平方根而不使用算术运算符
- 是否存在一个c++函数(内置或其他),可以在不重复操作的情况下给出整数除法和模除法的结果
- 浮点除法不完善
- 单词的除法与零不正确
- 为什么有人会用浮点乘法而不是除法呢