也许我不太了解 IEEE754 标准,但是给定一组 float
或 double
的浮点值,例如:
56.543f 3238.124124f 121.3f ...
您可以将它们转换为从
0
到 1
的值,因此您可以通过在考虑集合中的最大值和最小值时采用适当的公因数来规范化它们。现在我的观点是,在这个转换中,如果与我在第一个中需要的精度级别相比,我需要从
0
到 1
的目标集的精度更高,特别是如果第一组中的值覆盖范围广泛的数值(非常大和非常小的值)。float
或 double
(或 IEEE 754 标准,如果需要)类型如何处理这种情况,同时为第二组值提供更高的精度,因为我知道我基本上不需要整数部分?或者它根本不处理这个,我需要一个完全不同类型的定点数学?
最佳答案
浮点数以类似于科学记数法的格式存储。在内部,它们将二进制表示的前导 1
与有效数的顶部对齐。每个值都带有相对于其自身大小的相同数量的精度二进制数字。
当您将浮点值集压缩到范围 0..1 时,您将获得的唯一精度损失将是由于过程的各个步骤中发生的舍入。
如果您只是通过缩放进行压缩,那么在尾数的 LSB 附近您只会损失少量精度(大约 1 或 2 ulp,其中 ulp 的意思是“最后一位的单位”)。
如果您还需要转移数据,那么事情就会变得更加棘手。如果您的数据都是正数,那么减去最小的数字不会损坏任何东西。但是,如果您的数据是正数据和负数据的混合,那么您的一些接近零的值可能会损失精度。
如果您以 double
精度执行所有算术运算,则您将通过计算携带 53 位精度。如果您的精度需要符合(他们可能会这样做),那么您会没事的。否则,确切的数值表现将取决于您的数据分布。
关于c++ - 如何在 C++ 中正确规范化浮点值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20474946/