Math 双精度到数值数字和指数的转换
例如 双尺寸=10.35 我应该 数值=1035 指数=-2 所以当我重新计算时,我会得到10.35 i、 E1035*10^-2=10.35 请帮帮我。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)并
提前感谢一般来说,这是不可能的,因为双精度的小数部分存储在幂-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)