将C ++中的变量归一化到(0,1)之间以获得算术精度

时间:2012-05-28 10:24:03

标签: android c++ normalization precision

我正在计算标准化2D点的投影,并且我意外地发现它们比投影点时更准确而没有标准化它们。我的代码是用c ++编写的,我用NDK编译了一个没有FPU(浮点单元)的android手机。

为什么在我第一次将值标准化为0到1之间时,我使用C ++获得计算的准确性?

如果使用介于0和1之间的变量或者是否与编译ARM设备的情况相关,那么在C ++中通常是否可以获得算术的准确性?

2 个答案:

答案 0 :(得分:9)

你对精确度有误解。精度基本上是表示数字尾数的可用位数。

如果你将比例保持在0和1之间,你可能会发现你似乎有更多的数字,但这不是精确的,根据比例或符号,它根本不会改变。

例如,无论您的数字是0.5还是1e38,单精度都具有23位精度。双精度具有52位精度。

有关IEEE754位级表示的更多详细信息,请参阅this answer

答案 1 :(得分:3)

如果进行基于矩阵的计算,您可能需要计算矩阵的条件数。本质上,条件数测量答案中数值误差的大小,作为输入中数值误差大小的函数。据说条件数低的问题是条件良好的,而条件数高的问题据说是病态的。

对于某些问题,您可以预处理数据(例如,重新调整测量某些变量的单位),以使条件数更有利。例如。一个金融电子表格,其中一些列以美元美分计算,而其他列以十亿美元计算则是病态的。

有关详细说明,请参阅Wikipedia