gpt4 book ai didi

c++ - 存储简单分数值的 float 的替代方法

转载 作者:搜寻专家 更新时间:2023-10-31 00:37:25 24 4
gpt4 key购买 nike

首先,我要解决的问题是提出一种更好的表示值的方法,该值始终在范围内保持均匀分布:

0.0 <= x < 1.0

这样做的动机是尝试减少用于存储此数据的字节数(应用程序受内存和 I/O 带宽限制很大)。目前使用 32 位浮点表示,16 位浮点被证明不够准确。

我最初的想法是尝试将数据存储在 16 位整数中并简单地使用该方案:

x/(2^16 - 1) [x is an unsigned short]

为了保持算法基本相同并保留使用相同的浮点硬件操作(至少一开始是这样),理想情况下我希望继续将这种小数表示形式转换为浮点表示形式,执行操作(s ), 然后转换回分数表示形式进行存储。

显然,在这两种截然不同、不精确的表示之间来回切换会导致精度损失,但对于我们的应用程序,我怀疑这可能是一个可以接受的权衡。

我做了一些研究,了解目前的情况,这可能会给我们一个很好的起点。开创性的“每位计算机科学家都应了解的浮点运算知识”文章 (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) 让我看了其他几篇文章,“超越 float ”(home.ccil.org/~cowan/temp/p319-clenshaw.pdf) 就是一个这样的例子。

谁能指出人们在其他地方使用的可能满足这些要求的其他表示示例?

我担心表示的准确性方面的任何潜在 yield (我们目前通过使用这个特定范围浪费了很多浮点格式)将完全被从小数表示中舍入两次的要求所抵消到浮点并再次返回。在这种情况下,可能需要直接使用这种分数表示法进行算术运算,才能从这种方法中获益。关于这一点的任何建议都会有所帮助吗?

最佳答案

不要使用 2^16-1。使用 2^16。是的,您的精度会略微降低并浪费您的 0xFFFF,但您将保证在转换为 float 时不会损失精度。 (相比之下,从 float 转换时,您将失去 8 位的尾数精度。)

精度之间的往返转换可能会导致某些操作出现问题,尤其是逐步求和数字。如果可能的话,将您的定点值视为“脏值”,并且不要将它们用于进一步的浮点计算;更喜欢从输入重新计算而不是使用定点形式的中间结果。

或者,使用 24 位。使用这种表示法,只要您的值不下溢(也就是说,只要它们高于 2^-24),您就不会在任何方向上丢失精度。

关于c++ - 存储简单分数值的 float 的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19890247/

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