gpt4 book ai didi

c++ - 如何在不损失精度的情况下正确表示 float 中的大数值

转载 作者:太空宇宙 更新时间:2023-11-04 12:30:39 25 4
gpt4 key购买 nike

我有一些值从文件中读取为 string,它们大于 2^23。将它们转换为 float 时,由于精度损失,值会发生变化。

double d  = 50000167;
float f = (float)d;
f gives a value of 50000168.0

由于设计限制,我不能使用 double。如何使用 float 完成工作

最佳答案

你也许可以通过做一些 Hacky As Fuck 的事情来逃脱惩罚,模拟一个 40 位的 float ,然后在你需要使用它时将其重新组合成一个 double ,然后将它粉碎成一个带有额外字节的 float 精度存储在旁边。

这是 double 的布局:

enter image description here

与 float 布局相比:

enter image description here

所以基本上添加一个字节将使您从 23 位精度到 31 位精度。

您需要将原始值作为 double 值并屏蔽掉第 24-31 位,将它们写入您的额外字节,并将其与 float 一起保存。要切换回来,您需要将 float 转换回 double ,然后从额外的存储字节中设置 double 的小数位 24-31。

根据@drescherjm 的评论,这将为您提供大约 10 位精度,而这种特殊情况只需要 8 位。

所有这一切都有一个又大又丑的警告。如果你声明一个结构:

struct ugly40BitFloatHackityHackHack {
float mostOfTheValue;
BYTE extra8BitsOfPrecision;
};

... 由于“内存对齐”,编译器通常会保留 64 位( double 大小)。基本上,当变量在内存中正确排列时,计算机工作得更快,因此它们可以直接映射到 CPU 寄存器……在 32/64/任何位边界上。有一些方法可以控制内存对齐(或尽可能紧密地“打包”所有内容)。

啊。在重读你刚才的问题时,你并不关心“存储”,而是一些任意的设计约束。我猜这要么是为了上课,要么你的老板是一个化石,可以追溯到 CPU 可以做的最昂贵的事情是 float 学的时代。如今,CPU 花费太多时间等待内存。 “Back In The Day”,浮点运算可能需要 20-40 个周期,而 double 甚至比 float 更昂贵。如今,浮点运算很便宜(大约 1 个周期),而访问内存昂贵(缓存未命中可能花费大约 100-200 个周期……链表会让你的 CPU 流泪血)。

如果您的老板担心效率,请使用性能分析器。不要猜测。不要套用几十年过时的“智慧”。 使用分析器

如果这真的只是一个类作业,这可能只是一种教您了解 float 与 double 精度限制的方法。祝贺你的老师:成功了。

关于c++ - 如何在不损失精度的情况下正确表示 float 中的大数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58766643/

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