转换为电子记数法,以有效的位数最大化小数位数

时间:2018-12-17 12:10:22

标签: floating-point

我希望将数字转换为不超过3个小数的电子符号。 我不知道输入的符号,它可能是整数。 我也想最大化有效数字的数量。 该数字始终位于base_10中。 可能是负面的。 数字总数(整数+小数)不得超过18。 我在无类型的环境中进行编码,整数和浮点数之间没有区别。

Example 1: 0.001587301587 becomes 1587301.587E-9 
Example 2: 0.25 becomes 0.25

因此,代码应该选择两件事:小数位数和指数,以便确实使有效位数最大化。 小数位数不能超过3。


最初,我是通过将输入转换为字符串来完成此操作的,从右边开始计算小数点的位置。然后,我移动了小数点,将新数字除以原始数字,以找出指数。

这似乎可行,但是我正在寻找一个更“数学”的数字解决方案,最好使用某种伪代码。

1 个答案:

答案 0 :(得分:0)

考虑一个非零的实数 x ,其十进制表达式最多包含18个有效数字。

p 0 为下限(log 10 | x |)。这是 x 的前导有效数字的位置,表示为0表示一个位置,1表示十个位置,2表示百个位置,依此类推。 (为此,小数点后和前导非零数字之前的零(如“ .00034”一样,不算作有效数字。)

p 1 是最大整数,这样10 p 1 x 。 (等效地, p 1 是最大整数,这样 x 的模数/余数运算具有10 p 1 产生零。)然后 p 1 x 。

n p 0 - p 1 +1。这是 x 中的有效数字位数。

x 可以使用 x / 10 p 1 x / 10 p 1 +1 x / 10 p 1 +2 x / 10 p 1 +3 作为有效数,并显示指数为 p 1 p 1 +1, p 1 +2或 p 1 +3。

根据问题陈述,我不清楚要选择零,一,两位还是三位数。

可能没有一种很好的数学方法来表达如何计算 p 1 ,这比描述它为满足某些属性的最大整数要好。