围绕double的有效位数的相关问题

来源:百度知道 编辑:UC知道 时间:2024/06/23 01:14:30
最近做科学计算,程序计算出错,发现问题处在数据类型double上。
网上一般都说double的有效位数是小数点后15位,但是我测试的时候并没有达到15位。
有情行家多加指点:
1、double的有效位数为多少?
2、有没有替代double类型的第三方大数库,相关下载链接是多少?
(我的邮箱是lm5266@126.com)

程序如下:
#include <iostream>
#include <iomanip>
using namespace std;

int main(int argc, char* argv[])
{
double d1 = 2751.575016062296500;
double d2 = 2751.575016062297900;

// d3为d1和d2的平均值
double d3 = (d1 + d2)*0.5;

cout << setiosflags(ios::fixed) << std::setprecision(15)
<< "d1 = " << d1 << endl
<< "d2 = " << d2 << endl
<< "d3 = " << d3 << endl;

return 0;
}

d3的值理应为:2751.575016062297200
但输出结果如下:
d1 = 2751.575016062296500
d2 = 2751.575016062297900
d3 = 2751.575016062297400

先谢过了!

有效数字:对一个数据取其可靠位数的全部数字加上第一位可疑数字。(可靠数字+存疑数字)

有效位数:是该数中有效数字的个数,指从该数左方第一个非零数字算起到最末一个数字(包括零)的个数,它不取决于小数点的位置。

c语言中 实数(浮点数)形式包括十进制小数形式 和指数形式(e之前必须有数字,e后面的指数必须为整数)。
* 规范化的指数形式:e之前的小数部分中,小数点左边有且只有一位非零的数字

所以有效位数并不是只小数点后的位数。

double的示数范围是-1.7*10(-308)——1.7*10(308),示数精度是15-16位
* 规范化的指数形式:e之前的小数部分中,小数点左边有且只有一位非零的数字
示数精度表示的是全部的长度,有效位数并不是只小数点后的位数。

C语言的C99标准里面定义了long double和long long的类型,你或许可以用它们的。
不过,目前很多编译器都还不支持(或不完全支持)C99的。

如果不能用它们,那么,可能需要自己动手写个具备这个功能的函数了
因为,据我所知,没有现成的库。

double的示数范围是-1.7*10(-308)——1.7*10(308),示数精度是15-16位。我不知道这个所谓网上看到的是小数点后15位是哪位写的;示数精度表示的是全部的长度,包括小数点前的4位有效数字