2012-03-04 59 views
1

一個Emacs org-模式文件I要嵌入在org-模式文件簡單的數學表達式,例如:簡單的數學結果與巴別

sqrt(p * (1-p) * N) 

其中p = 0.8,N = 10,000和根據一個簡單的桌面計算器,答案是40,我有沒有運氣獲取組織,巴貝爾給我這個答案...這裏是一個組織文件:

Some weird rounding errors with Python: 

#+begin_src python :var N=100000 :var p=0.8 
from math import sqrt 
return sqrt(p * (1 - p) * N) 
#+end_src 

#+results: 
: 126.491106407 


Some other weird rounding errors, this time with Emacs lisp: 

#+begin_src elisp :var N=100000 :var p=0.8 
(sqrt (* p (- 1 p) N)) 
#+end_src 

#+results: 
: 126.49110640673517 


Note sure which number calc is unhappy with: 

#+begin_src calc :var N=100000 :var p=0.8 
sqrt(p * (1 - p) * N) 
#+end_src 

#+results: 
| 5 | Expected a number | 


Yet more weird rounding errors, using bc in the shell: 

#+begin_src sh :var N=100000 :var p=0.8 
echo "sqrt($p * (1 - $p) * $N)" | bc 
#+end_src 

#+results: 
: 100.0 


A different set of rounding errors with bc without using variables: 

#+begin_src sh 
echo "sqrt(0.8 * (1 - 0.8) * 10000)" | bc 
#+end_src 

#+results: 
: 31.6 


Looks like the variables are being substituted OK: 

#+begin_src sh :var N=100000 :var p=0.8 
echo "sqrt($p * (1 - $p) * $N)" 
#+end_src 

#+results: 
: sqrt(0.8 * (1 - 0.8) * 100000) 


Using extra precision directly gives the correct result: 

#+begin_src sh 
echo "sqrt(0.80 * (1 - 0.80) * 10000)" | bc 
#+end_src 

#+results: 
: 40.0 


So, just use extra precision in the p variable, eh: 

#+begin_src sh :var N=100000 :var p=0.80 
echo "sqrt($p * (1 - $p) * $N)" | bc 
#+end_src 

#+results: 
: 100.0 


No! Because it get stripped out: 

#+begin_src sh :var N=100000 :var p=0.80 
echo "sqrt($p * (1 - $p) * $N)" 
#+end_src 

#+results: 
: sqrt(0.8 * (1 - 0.8) * 100000) 


Please God, kill me now... 

我只是在尋找一種方便的方法來在組織文件中嵌入一些數學。

(組織模式從最近的混帳chekout 03年7月8日從最近的git結帳時,Emacs 24.0.93.1)

回答

2

你說:

sqrt(p * (1-p) * N) 

where p=0.8, N=10,000 and the answer according to a simple desk calculator is 40. 

這是正確的,但在許多你的代碼的使用

:var N=100000 

代替,即關閉的10。

>>> from math import sqrt 
>>> p = 0.8 
>>> sqrt(p*(1-p)*10000) 
40.0 
>>> sqrt(p*(1-p)*100000) 
126.49110640673517 
+0

Yikes,在整個文件中傳播了一個錯字,並剪下了'n貼... – jimmy 2012-03-04 22:17:46

4

不要殺自己在一個錯字:)

(sqrt (* p (- 1 p))) 
0.39999999999999997 

添加缺少ñ..

(let ((p 0.8) (N 10000)) 
    (sqrt (* p (- 1 p) N))) 

40.0 

對於BC,嘗試用

scale=10 
+1

好的建議的一個因素。我會投票但沒有足夠的代表。 – jimmy 2012-03-04 22:21:53

+1

@jimmy那麼你最好回來,當你得到代表投票。開玩笑:) – 2012-03-05 03:04:23