我们可以说0.5 * x + 0.5 * x == x总是如此吗?

时间:2017-06-10 05:57:40

标签: floating-point precision floating-accuracy ieee-754

void delayed_task(){ std::this_thread::sleep_for(10) work_on_delayed_task(); } int main() { while(true){ std::thread my_thread(delayed_task); my_thread.detach(); do_main_work(); } } 0.5的(负)幂,这意味着它可以由 IEEE-754二进制浮点格式完全表示。在单位精度中,它是2

根据我关闭优化的快速测试(0'01111110'00000000000000000000000),结果是-O0,然后是y = 0.5 * x。但它是否始终由IEEE-754标准保证?

我知道,一般来说y + y == xn2m = 1.0 / n的正整数幂,然后将y = m * x加在一起{{1}时间不会产生y。但似乎是n是的。

我错过了什么吗?

1 个答案:

答案 0 :(得分:6)

不,这是一个具有double精度浮点的简单计数器示例:

double x = 4.9E-324; // minimum positive value
double y = x * 0.5; // this doesn't only look like a zero this positive zero all 0 bits
bool test = y + y == x; // false

IEEE-754下的浮点数精度有限,除以2时我们可能会丢失信息。在大多数情况下,当数字较小时,你可以获得准确度,你可以减少指数,但如上所述,这并不总是足够的。有时你不能减少指数。

任何具有最小指数和奇数尾数的东西都不会保持相等。这样的例子是x = 5.0E-322