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