Re: [問題] 準確度問題

看板Fortran作者 (sjgau)時間15年前 (2009/11/10 07:10), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/5 (看更多)
使用 C 來寫程式,比較快。 底下,使用一個 簡單的 C語言程式, 來說明 real*8 的有效位數,只有 15 - 16 位數。 /* x= 9641664765690384.000, y= 9641664765690384.000 當 x >= 上面那個數字的時候, y= x + 1, 有加,跟 沒有加一樣, y 還是 等於 x. 所以,由以上 可以 證明, real*8 的精確度,只有到 2^52 左右 z= 53.098 以上,之所以會使得 精確度到達 2^53 左右,是因為 IEEE 的工業標準, 使用了 一些 特殊的技巧, 我們是 程式語言的使用者,不太需要去 了解 其中的細節, 而且,我們使用一個工具,最好 能夠保留一些 安全係數, 所以,還是 保守一點比較好。 real*8 的有效位數,大概就是 15 - 16 位。 Press any key to continue */ // VC1110.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <stdio.h> #include <math.h> #include <process.h> int main(int argc, char* argv[]) { double x, y, z; x= 10.0; y= x + 1.0;// y= 11, > 10 while (y > x) { x= x*1.1; y= x + 1.0; } printf("x= %.3lf, \ny= %.3lf\n", x, y); // ------------------------------------------ z= log(x)/log(2.0); printf("\n z= %.3lf\n", z); return 0; } ※ 引述《mon02118 (我不是好男人)》之銘言: : 我們老師出一個作業 : 計算 : 2^3 2^5 2^7 2^9 2^49 : 1- ----- + ----- - ----- + ----- .... ------ : 4! 6! 8! 10! 50! : 這是我打的 : implicit none : integer::i,a,c : real(kind=8)::ss,n,v : a=1 : do i=1,50 : if(i/2*2/=i)n=2**i : a=a*i : if(i/2*2==i)then : v=a : c=c+1 : ss=ss-(-1)**c*n/v : write(*,*)c,ss : endif : enddo : end : 算出來的 : 1 1.00000000000000 : 2 0.666666666666667 : 3 0.711111111111111 : 4 0.707936507936508 : 5 0.708077601410935 : 6 0.708073325851104 : 7 0.708079731129053 : 8 0.708063381375117 : 9 0.707917491813515 : 10 0.708166899470330 : 11 0.704154863362005 : 12 0.714965674172816 : 13 0.696866126661503 : 14 0.794427102271259 : 15 1.17537948322364 : 16 0.175379483223640 : 17 NaN : 18 NaN : 19 NaN : 20 NaN : 21 NaN : 22 NaN : 23 NaN : 24 NaN : 25 NaN : 好像算到第10項就錯了, 請問我應該怎麼修改呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.231.73.177
文章代碼(AID): #1A-A5a3x (Fortran)
文章代碼(AID): #1A-A5a3x (Fortran)