如何正确地规范化C++中的浮点值?

use*_*710 7 c++ floating-point double ieee-754

也许我不明白的IEEE754标准多,但考虑到一组浮动是点值的floatdouble,例如:

56.543f 3238.124124f 121.3f ...
Run Code Online (Sandbox Code Playgroud)

您可以将其转换为范围为0to的值1,以便通过在考虑集合中的最大值和最小值时采用适当的公因子来对它们进行标准化.

现在,我的观点是,在这个转变,我需要为所设定的目的地的范围从一个更高的精确度0,以1如果比较的精度水平,我需要在第一位的,尤其是在第一盘的值覆盖面广数值范围(真正大而小的值).

如何float或者double(如果你想或IEEE 754标准)类型可以处理这种情况而知道我基本上不会需要一个整数部分的第二组值提供更准确?

或者它根本不处理这个问题我需要一个完全不同类型的定点数学?

Joe*_*e Z 6

浮点数以类似于科学记数法的格式存储.在内部,它们将1二进制表示的前导对齐到有效数字的顶部.每个值都使用相对于其自身大小的相同数量的精度二进制数字来承载.

当您将浮点值集合压缩到0..1范围时,您将获得的唯一精度损失将归因于在该过程的各个步骤中发生的舍入.

如果你只是通过缩放进行压缩,你将在尾数的LSB附近失去很少的精度(大约1或2 ulp,其中ulp表示"最后位置的单位").

如果您还需要转移数据,那么事情会变得棘手.如果您的数据都是正数,则减去最小数字不会损坏任何数据.但是,如果您的数据是正数据和负数据的混合,那么接近零的某些值可能会损失精度.

如果以double精度完成所有算术运算,则计算中将携带53位精度.如果你的精确度需要在那个范围内(他们可能会这样做),那么你会没事的.否则,确切的数值性能将取决于数据的分布.