计算非常小值的-log10

2 投票
5 回答
2136 浏览
提问于 2025-04-17 16:44

有没有办法计算 -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

撰写回答