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