2013-02-22 48 views
2

有沒有辦法計算-log10values。計算非常小的值-log10

其中值非常小即3 * e-178或e-320。

我試過公式日誌((1 /值),10)的開放式辦公,它工作的很好,但是當它遇到非常小的值時,它給出的錯誤如零除以不可能。

我想同樣會發生時,我會用Perl或Python或R

在將這些值-log10value

請幫忙,謝謝

注:我想計算負日誌與底座10

+0

你從哪裏得到你的號碼?他們代表什麼? – QkuCeHBH 2013-02-22 11:37:30

+0

這些是p值 – Angelo 2013-02-22 12:20:02

+0

我在想這些值的任何虛假設可能都是錯誤的。 – 2013-02-23 03:53:05

回答

3

一個Perl的一個班輪:

perl -e 'print log($ARGV[0])/log(10),"\n"' 3e-320 

輸出:

-319.522883580228 
+0

它產生'不能在Ubuntu盒子(perl v5.14.2)上的-e line 1處記錄0,即'3e-320'太小。雖然[它對ideone有效](http://ideone.com/qUttk6)。 – jfs 2013-02-22 20:12:35

+0

@ J.F.Sebastian:它適用於Debian 2.6.32/perl 5.10和windows/perl 5.14,直到3e-324,並在3e-325失敗 – Toto 2013-02-23 09:28:40

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 
1

你可以計算日誌10使用decimal module in Python例如任意精度使用默認精度:

from decimal import Decimal as D 

for f in [3e-178, 1e-320, 3e-320, "1e-325", "3e-325"]: 
    print("%s\t%s" % (f, D(f).log10())) 

Output

3e-178 -177.5228787452803375835172220 
1e-320 -320.0000048349480421542963792 
3e-320 -319.5228835802283797170013513 
1e-325 -325 
3e-325 -324.5228787452803375627049721 

或者:

import decimal 

decimal.getcontext().prec = 70 
for f in [3e-178, 1e-320, 3e-320, "1e-325", "3e-325"]: 
    print("%s\t%s" % (f, decimal.Decimal(f).log10())) 

Output

3e-178 -177.5228787452803375835172220093158130425818111446701314507791687173572 
1e-320 -320.0000048349480421542963791664378178773271498211156984605956663618384 
3e-320 -319.5228835802283797170013512631827025681270209569250025957658007215332 
1e-325 -325 
3e-325 -324.5228787452803375627049720967448846907998711358093041351701343596948 
2

正如您應該能夠從其他答案中所瞭解的那樣,更好的公式是-log10(value),或者在OpenOffice Calc電子表格中,= -LOG(value,10)。

但是,您需要確保輸入的值不會下溢到0。 -OG(3E-178,10)工作(177.522879),但-LOG(1E-320,10)失敗,因爲1E-320下溢到0並且出現Err.502。 (這也許就是爲什麼你使用1 /值也會爆炸的原因。)