gpt4 book ai didi

c++ - 将大整数转换为 float 而不舍入 C++

转载 作者:行者123 更新时间:2023-11-30 03:23:17 25 4
gpt4 key购买 nike

有没有一种快速而干净的方法可以将 int32_t(或更大)转换为不大于存储在 int32_t 中的原始值的最大可表示浮点值?

根据 IEEE754 标准(仅在维基百科上阅读 https://en.wikipedia.org/wiki/Single-precision_floating-point_format ),大整数的转换是通过舍入到最接近的 2 的幂的倍数来完成的。哪个幂取决于该值的大小。

但是我想知道,是否有可能将这种转换转换为“最大的 float 而不是更大的”,并以一种干净的方式进行转换而不需要复杂的结构,最好是通过设置一些标志或使用一些内置的说明?

编辑:我有一个值 x_int 存储在 int32_t 或 int64_t 中,我想将它转换为浮点值 x_float,这样对于这些值(数学上,不是编程延迟)

x_int>=x_float

始终为真。 int32_t 的可能解决方法是使用 double,但我不确定 int64_t。

最佳答案

行为可能取决于有效的编译器选项。例如在 msvc /fp:fast 中牺牲了速度的正确性。如果这不是您想要的,请指定 /fp:strict/fp:precise(默认)。在 Clang 上,-menable-unsafe-fp-math 做了类似的事情。

浮点舍入模式由fesetround控制。

使用 fegetround 检索舍入模式,以便稍后恢复,接下来使用 fesetround 设置所需的舍入模式(在您的情况下为 FE_TOWARDZERO 如果你的意思是最小的幅度,或者 FE_DOWNWARD 否则)然后将它转换为 float。最后恢复舍入模式。

inline float cast_with_mode(int32_t value, int mode){
int prevmode = fegetround();
if(prevmode == mode) return (float)value; // may be faster without this
fesetround(mode);
float result = (float)value;
fesetround(prevmode);
return result;
}

在性能方面,将 prevmodemode 进行比较可能会更好,也可能不会更好。如果它已经正确,则无需设置或恢复它。我不知道比较是否比设置/恢复更快或更慢。

示例输出(在 Clang 和 G++ 上相同):

Mode           Value       Value          ResultBits   Result Value
FE_TOWARDZERO: 2147483520 0x7fffff80 => 4effffff 2147483520.000000
FE_UPWARD: 2147483520 0x7fffff80 => 4effffff 2147483520.000000
FE_TOWARDZERO: 2147483584 0x7fffffc0 => 4effffff 2147483520.000000
FE_UPWARD: 2147483584 0x7fffffc0 => 4f000000 2147483648.000000

关于c++ - 将大整数转换为 float 而不舍入 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50488704/

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