回答
这种表达应该始终评估为true
,有几个注意事项:
- 而分子不超过2^52;否则他们会失去精确度。
- 分母不超过双精度提供的范围。
- 您必须在使用基数2浮点(基本上所有现代机器)的平台上工作。
为什么分母不能太大,你能完成请 – Guillaume07 2011-06-05 21:56:23
我已编辑。 – Guillaume07 2011-06-05 21:59:07
@ Guillaume07:在这种情况下,它非常大(或者实际上非常小),它们超出了双精度范围。可能不会成为你的关心!另一个要考虑的是分子是否会超过2^52(否则他们会失去精度)。 – 2011-06-05 22:02:58
通常,浮点相等比较的工作原理不取决于值,而是取决于数值。
例如
double v = 4/3.0; // inexact
double old_v = v;
some_func_that_might_change_its_argument(&v);
if (v == old_v) { ... }
可能,尽管不精确的价值很好地工作,而:
double v = 0;
for(int i = 0; i < 5; ++i) v += 0.1;
if (v == 0.5) { ... }
可能分母是一个失败,即使不等式的两边可以表示为一个简单的有理数2.
恰好如此,第二个例子确实导致了平等。 – 2011-06-05 22:08:26
@Oli:在哪个系统上?该标准不允许。并且,例如,[这个微小的变化](http://ideone.com/ZbHhf)不会。 – 2011-06-05 22:40:17
我同意不能保证他们是平等的。但在IEEE-754(双倍或单一)中,总和确实为0.5。 – 2011-06-05 22:49:05
功率我无法引用任何说,这是保证,但在逻辑上它应该工作,因为所有IEE754浮点数表示为M * 2^E,其中M和E都是整数(和可能是负面的)。
因此,3/4.0
和6/8.0
都是正好是等于3 * 2^-2并且可以用IEE754格式完全表示。
此外,鉴于:
% cat test.cc
double three_quarters = 3/4.0;
double six_eighths = 6/8.0;
我们得到:
% c++ -S test.cc
% cat test.s
.globl _three_quarters
.data
.align 3
_three_quarters:
.long 0
.long 1072168960
.globl _six_eighths
.align 3
_six_eighths:
.long 0
.long 1072168960
这都说明两个表达式已经减少(由编译器),以相同的恒定值。
尽管C++并没有强制要求IEEE754进行浮动和双精度处理;) – fredoverflow 2011-06-06 08:56:13
没有要求C++实现使用IEEE 754浮点(或类似)。但如果你的确如此,这应该可以正常工作。
- 1. 比较两个字符串的百分比:如果$的$ B
- 2. 问题与比较两个分数
- 3. 比较两个阵列具有非常分散的值
- 4. 我收到错误的结果比较两个字母
- 5. 比较两个(2)日期
- 6. 比较两个HTML块,如果它具有相同的内容
- 7. 两次CGRect比较的百分比
- 8. iOS的分配工具:比较两个快照的内存
- 9. 比较两个fxcop结果
- 10. Git:我们可以比较两个相同文件的分步版本吗?
- 11. 两个函数的比较结果
- 12. VB.NET - 比较两个字母的代码
- 13. 我如何比较两个数组php
- 14. 是否有比较/比较两个Java包的体面工具?
- 15. 是否可以比较两个游标?
- 16. 我如何可以比较两个NSTimeInterval类型的对象
- 17. 如何将访问者分成两个介绍页面,以比较每位访问者的注册人数?
- 18. 分析漏斗,跟踪具有不同参数的两个URL,两者都被触发为相同的URL。
- 19. 2部分数字比较
- 20. 比较两个以逗号分隔的字符串
- 21. 比较两个查询结果与输出差分
- 22. 如果比较两个序列相等
- 23. 比较两个结果并打印缺少的部分(如果存在)
- 24. 如何使用scala + spark比较两个rdds?这两个rdds都没有钥匙?
- 25. 比较具有不同维数的两个数组
- 26. 如何比较两个具有多个值的键的地图?
- 27. 如何比较两个分隔字符串中的每个值?
- 28. 比较配置单元中的两个分区的数据
- 29. 如果比较条件为两个或两个以上的把手
- 30. 如果两个号码具有相同的平均得分,以较低的ID数量将打印的第一
你为什么不试试自己? – Saphrosit 2011-06-05 21:53:29
@Saphrosit:因为我想确认和建议/评论 – Guillaume07 2011-06-05 21:55:07
@Saphrosit:浮点错误非常复杂,依赖测试随机值是一个很好的方法来得出错误的结论。 – 2011-06-05 21:57:19