Re: [問題] 準確度問題
使用 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
討論串 (同標題文章)
Fortran 近期熱門文章
PTT數位生活區 即時熱門文章