gpt4 book ai didi

c++ - 准确地创建范围 [a,b) 中的浮点值

转载 作者:太空狗 更新时间:2023-10-29 20:35:32 28 4
gpt4 key购买 nike

考虑

auto x = a + (b-a)*v;

这意味着在 [a,b) 范围内创建一个值因数v[0,1.0) .从纯数学的角度来看,x>=a , 和 x<b .但是我们如何证明或确保这适用于 float 呢? a , b , v是相同类型( doublefloat )和 b>a 的非负有限浮点值(最初说 b>=a 这显然不符合我对 x 的要求)和 v<=netxtafter(1.0,0) (也就是说,它刚好低于 1.0)。

很明显,b-a >0 ,因此 (b-a)*v >=0 ,这样我们就不需要检查:

if (x<a) return a;

但这也是多余的吗?

if (x>=b) return std::nextafter(b,a);

编译器(优化)可以重写表达式来影响这些问题吗?浮点表示的类型是否进入? (我最感兴趣的是最常见的 (iec559/IEEE 754)。

最佳答案

It seems obvious, that b-a >0, and therefore (b-a)*v >=0, so that we don't need to check: if (x<a) return a;

属性(property)b - a > 0在 IEEE 754 中是正确的,但我不会说这很明显。在浮点标准化的时候,Kahan fought for this property resulting from “gradual underflow” to be true .其他提案没有次正规数,也没有使它成为现实。你可以有 b > ab - a == 0在这些其他提案中,例如采用 a最小的正数和b它的继任者。

即使没有逐渐下溢,在通过将次正规数刷新为零来错误实现 IEEE 754 的系统上,b > a暗示b - a >= 0 , 这样就不用担心 x低于a .

But is this also redundant? if (x>=b) return std::nextafter(b,a);

即使在 IEEE 754 中,此测试也不是多余的。以 b 为例成为a的继任者| .对于 v 的所有值以上0.5 , 在默认舍入到最近模式下,a + (b-a)*v 的结果是b ,你试图避免。


我的例子是用不寻常的值构建的 ab因为这使我免于编写程序来通过蛮力查找反例,但不要假设其他更可能是 a 的值对和 b不要表现出问题。如果我正在寻找额外的反例,我会特别寻找浮点减法 b - a 的值对。向上舍入。


编辑:哦,好吧,这是另一个反例:

a成为-1.0的继任者的继任者(即,在 double 中,使用 C99 的十六进制表示法 -0x1.ffffffffffffep-1 )和 b成为3.0 .然后 b - a四舍五入到 4.0,取 v成为1.0的前身, a + (b - a) * v rounds up3.0 .

浮点减法b - a a 的某些值不需要四舍五入和 b做一个反例,如图here :服用a作为1.0的继任者和 b作为2.0也有效。

关于c++ - 准确地创建范围 [a,b) 中的浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42411053/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com