什么时候对 IEEE 浮点数使用科学记数法?
When to use scientific notation for IEEE floats?
我正在开发一个应用程序,它提供了一个可以显示从远程源读取的值的 HMI。应用程序不知道这些值本身的含义——这是由最终用户配置的。
支持的类型之一是 32 位浮点数(IEEE 单精度)。由于 IEEE 浮点数只能具有有限的精度,因此当表示非常大或非常小的值时(例如 12312984124000000000000000000000、.000000000000000000000032423894),有许多数字不传达任何附加信息。在这些情况下,为了清楚起见,我想改用科学计数法。
问题是:鉴于 IEEE 32 位浮点数的精度和特性,是否有明确定义的算法来确定何时进行此切换?理想情况下,当值的十进制表示形式包含非有效数字时会发生这种情况。
由于 float
有大约 7 位有效数字,如果 log10(abs(x)) > 7 或 log10(abs(x)) < -7,您应该切换到科学计数法。
更新:
由于浮点数仍然是二进制格式,所以最好关注二进制值。它有23位有效的二进制数字,所以你可以检查
abs(x) > 223 和 abs(x) < 2-23.
在 C 中,您可以使用 (1 << 23) 获取第一个值,并使用 FLT_EPSILON
从 float.h
获取第二个值。
我正在开发一个应用程序,它提供了一个可以显示从远程源读取的值的 HMI。应用程序不知道这些值本身的含义——这是由最终用户配置的。
支持的类型之一是 32 位浮点数(IEEE 单精度)。由于 IEEE 浮点数只能具有有限的精度,因此当表示非常大或非常小的值时(例如 12312984124000000000000000000000、.000000000000000000000032423894),有许多数字不传达任何附加信息。在这些情况下,为了清楚起见,我想改用科学计数法。
问题是:鉴于 IEEE 32 位浮点数的精度和特性,是否有明确定义的算法来确定何时进行此切换?理想情况下,当值的十进制表示形式包含非有效数字时会发生这种情况。
由于 float
有大约 7 位有效数字,如果 log10(abs(x)) > 7 或 log10(abs(x)) < -7,您应该切换到科学计数法。
更新:
由于浮点数仍然是二进制格式,所以最好关注二进制值。它有23位有效的二进制数字,所以你可以检查
abs(x) > 223 和 abs(x) < 2-23.
在 C 中,您可以使用 (1 << 23) 获取第一个值,并使用 FLT_EPSILON
从 float.h
获取第二个值。