作者sjgau (sjgau)
看板Fortran
标题Re: [问题] 准确度问题
时间Tue Nov 10 07:10:26 2009
使用 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