计算非常小值的-log10
有没有办法计算 -log10 值呢?
这里的值非常小,比如 3*e-178 或者 e-320。
我试过用 Open Office 的公式 log((1/value),10),这个方法很好用,但当遇到极小的值时,就会出现错误,比如说不能进行零除法。
我猜用 Perl、Python 或 R 的时候也会遇到同样的问题。
请帮我把这些值转换成 -log10 值。
谢谢!
注意:我想计算的是以 10 为底的值的负对数。
5 个回答
3
在Python中:
import math
math.log10(3e-320)
返回
-319.5228835802284
如果想了解Python在处理非常小的数值方面的能力:
import sys
sys.float_info
返回的结果(这取决于你的系统):
sys.float_info(max=1.7976931348623157e+308,
max_exp=1024,
max_10_exp=308,
min=2.2250738585072014e-308,
min_exp=-1021,
min_10_exp=-307,
dig=15,
mant_dig=53,
epsilon=2.220446049250313e-16,
radix=2,
rounds=1)
虽然 math.log10(3e-320)
返回了正确的值,但 math.log10(3e-325)
会引发一个 ValueError: math domain error
错误。
6
在R语言中:
x <- 3e-320
log10(x)
#-319.5229
y <- 3*exp(-320)
log10(y)
#-138.4971
对于很大的指数:
library(Brobdingnag)
x <- 3*as.brob(10)^(-1000)
log10(x)
#-999.5229
y <- 3*as.brob(exp(1))^(-1000)
log10(y)
#-433.8174
或者:
log10(3)-1000
#-999.5229
3
这是一个用 Perl 语言写的单行代码:
perl -e 'print log($ARGV[0])/log(10),"\n"' 3e-320
输出结果:
-319.522883580228