【发布时间】:2012-12-21 15:17:23
【问题描述】:
据我解释,numeric_limits::is_exact 中的MSDN's definition 几乎总是错误的:
在 [this] 类型上完成的 [all] 计算没有舍入误差。
而IBM's definition 几乎总是正确的:(或循环定义,取决于您如何阅读)
一种对其所有值都有精确表示的类型
我可以肯定的是,我可以将2 存储在double 和long 中,并且它们都将被准确地表示。
然后我可以将它们都除以10,并且两者都不会保留数学结果精确。
给定任何数字数据类型T,定义std::numeric_limits<T>::is_exact 的正确方法是什么?
编辑: 我已经从许多答案中提供的详细信息中向这个问题发布了what I think is an accurate answer。 This answer is not a contender for the bounty.
【问题讨论】:
-
2 / 10被精确存储(对于long),因为整数除法的结果是整数。 -
@GManNickG 是的,并且 2.0 / 10.0 也被精确存储(对于双精度数),因为双除法的结果是双精度数。
2/10不是 0,除非有特殊规则。 -
我会考虑 exact 一个数字类型,
x + y != x && x + y != y时x != 0 && y != 0 -
应该是 ::is_exact_as_long_as_it_does_not_overflow_otherwise_could_trigger_undefined_behavior 但名字有点太长了
-
@aka.nice:不,unsigned 类型不会永远溢出,它们会环绕。他们的模算术是由标准规定的。
标签: c++ numeric-limits