Math 双精度到数值数字和指数的转换

Math 双精度到数值数字和指数的转换,math,Math,例如 双尺寸=10.35 我应该 数值=1035 指数=-2 所以当我重新计算时,我会得到10.35 i、 E1035*10^-2=10.35 请帮帮我。 提前感谢一般来说,这是不可能的,因为双精度的小数部分存储在幂-2中,并且可能与幂-10匹配,也可能不匹配 例如:当查看2次幂和3次幂时:就像1/2==2^-1==5*10^-1有匹配项一样,1/3==3^-1==??没有火柴 但是,您可以近似计算它 如果你要求2的幂,它会有一个答案。在这种情况下,您只需查看双精度表示(参见IEEE-754)并

例如

双尺寸=10.35

我应该

数值=1035

指数=-2

所以当我重新计算时,我会得到10.35

i、 E1035*10^-2=10.35

请帮帮我。
提前感谢

一般来说,这是不可能的,因为双精度的小数部分存储在幂-2中,并且可能与幂-10匹配,也可能不匹配

例如:当查看2次幂和3次幂时:就像1/2==2^-1==5*10^-1有匹配项一样,1/3==3^-1==??没有火柴

但是,您可以近似计算它

如果你要求2的幂,它会有一个答案。在这种情况下,您只需查看双精度表示(参见IEEE-754)并提取正确的位。

非常简单(在C中):

尽管我相信再多想一想,就能找到一个更优雅的解决方案


如果你有一个大的数字(比如说103600)并且想要得到某个幂的最小值(1036*10^2),那么这就不是另一种方式了。

我不得不做一些非常类似的事情。下面是Python中的一个解决方案(它没有经过很好的测试):

def正常化(值,fdigits=2):
"""
将表示数值的字符串转换为数字/指数形式的值。
将小数部分四舍五入到给定的位数。
值-值(字符串)
fdigit将小数四舍五入到的位数
部分
"""
#如果字符串为空,则返回错误
如果不是值:
一无所获
#按十进制分割值
v=值。拆分('.'))
#如果小数太多,则返回错误
如果len(v)>2:
一无所获
#如果缺少小数部分,请为其添加空字符串
elif len(v)==1:
v、 附加(“”)
#分配全部和部分
(w,f)=v
#如有必要,将小数部分填充到有效位数
如果len(f)数字:
#将两部分转换为整数;如果缺少整个部分,请使用“0”
(wi,fi)=(int(w或“0”)、int(f[:fdigits]))
#如果第一个不重要的数字是gteq 5,则进行四舍五入
如果int(f[fdigits])>=5:
fi+=1
#如果分数部分舍入为整数,则向上滚动整数值
如果len(str(fi))>fdigits:
wi+=1
fi=0
#替换整字符串和小数字符串
(w,f)=(str(wi),(“%0”+str(fdigits)+“d”)%fi)
#导出数值数字和指数
n=w.lstrip()+f
l=len(n)
x=-fdigits
n=n.rstrip('0')
x+=(l-透镜(n))
#返回值数字和指数
返回(整数(n),x)
        double size = 10.36;
        int power = 0;
        while (size != (int)size)
        {
            size *= 10.0;
            power--;
        }
        Console.WriteLine("{0} * 10 to the {1}", size, power);
def normalize(value, fdigits=2):
    """
    Convert a string representing a numerical value to value-digit/exponent form. 
    Round the fractional portion to the given number of digits.

    value    the value (string)
    fdigits  the number of digits to which to round the fractional 
             portion
    """

    # if empty string, return error
    if not value:
        return None

    # split value by decimal
    v = value.split('.')

    # if too many decimals, return error
    if len(v) > 2:
        return None

    # add empty string for fractional portion if missing
    elif len(v) == 1:
        v.append('')

    # assign whole and fractional portions
    (w, f) = v

    # pad fractional portion up to number of significant digits if necessary
    if len(f) < fdigits:
        f += ('0' * (fdigits - len(f)))

    # if the number of digits in the fractional portion exceeds the
    # number of digits allowed by fdigits
    elif len(f) > fdigits:
        # convert both portions to integers; use '0' for whole portion if missing
        (wi, fi) = (int(w or '0'), int(f[:fdigits]))

        # round up if first insignificant digit is gteq 5
        if int(f[fdigits]) >= 5:
            fi += 1

            # roll whole value up if fractional portion rounds to a whole
            if len(str(fi)) > fdigits:
                wi += 1
                fi = 0

        # replace the whole and fractional strings
        (w, f) = (str(wi), ("%0" + str(fdigits) + "d") % fi)

    # derive value digits and exponent
    n = w.lstrip() + f

    l = len(n)
    x = -fdigits

    n = n.rstrip('0')
    x += (l - len(n))

    # return value digits and exponent
    return (int(n), x)