为什么小数后面的数字都是零
Why the digits after decimal are all zero?
我想执行一些计算,我希望结果精确到小数点后几位,比如12。所以我写了一个示例:
#define PI 3.1415926535897932384626433832795028841971693993751
double d, k, h;
k = 999999/(2*PI);
h = 999999;
d = PI*k*k*h;
printf("%.12fn", d);
但是它给出了输出:
79577232813771760.000000000000
我甚至使用setprecision(),但相同的答案,而不是指数形式。
cout<<setprecision(12)<<d<<endl;
打印
7.95772328138e+16
使用long double also,但是没有用。
现在除了在long - long int类型中分别存储整数部分和小数部分之外,还有其他方法吗?
如果是这样,我们可以做些什么来精确地得到答案?
双精度数只有16位左右。小数点之后的都是无意义的。(事实上,点左边的最后一位或两位可能不符合无限精度的计算。)
长双精度是不标准化的,我敢说。在您的系统中,它可能与double相同,或者没有更精确。这会让我有点惊讶,但它并没有违反任何东西。
你需要再读一遍双精度概念;更仔细地。
double
通过使用64位提高了精度。
小数点前的比小数点后的更重要。
所以,当你有一个大的整数部分时,它会截断较低的精度——这在这里的各种答案中被描述为rounding off
。
:
为了提高精度,您需要使用一些库或更改您的语言。
检查另一个问题:处理大数(50000+数字)的最佳编码语言
然而,我要求你再检查一次你的意图。
- 你真的需要12位小数来表示非常高的数值吗
(超过10位数的整数部分,如在您的例子)? - 也许你真的不会有大的整数部分
(在这种情况下,这些代码应该可以正常工作)。 - 但是如果你正在跟踪像
10000000000.123456789
这样的值,
我真的很想知道你到底在做什么应用(天文学?)。 - 如果您的值的整数部分在
10000
下的某种方式,您应该在这里很好。
更新2 :
如果你必须证明一个特定的公式能够在有限的误差范围内准确地工作,那么就应该修正公式的处理过程,使引入的误差最小。
,
- 如果你想写
(x * y) / z
- 谨慎的做法是尝试
max(x,y)/z * min(x,y)
- 而不是原来的形式,它可能在
(x * y)
之后溢出,如果不适合double
的16位小数,则失去精度。
如果只有2位精度,
. 2-digit regular-precision
`42 * 7 290 297
(42 * 7)/2 290/2 294/2
Result ==> 145 147
But ==> 42/2 = 21
21 * 7 = 147
这可能是你比赛的目的。
大多数计算机使用的双精度二进制格式只能容纳大约16位,之后您将得到四舍五入。见http://en.wikipedia.org/wiki/Double-precision_floating-point_format
浮点值有数字范围限制。仅仅因为您的"PI"值的位数是double
所支持位数的六倍,并不会改变硬件的工作方式。
一个典型的(IEEE754) double
将产生大约15-16位小数。不管是0.12345678901235,1234567.8901235,12345678901235还是12345678901235000000000,或者其他的变化。
换句话说,是的,如果你精确地计算你的计算,你会得到很多小数点,因为pi
永远不会结束。在计算机上,你得到大约15-16位数字,不管你使用什么输入值——所有改变的是小数点在序列中的位置。要获得更多,您需要"大数支持",例如Gnu多进程(GMP)库。
您正在寻找这告诉ostream 不使用指数形式。std::fixed
.
cout << setprecision(12) << std::fixed << d << endl;
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 获取数字小数部分的最佳方法
- C 如何在小数系统中添加两个数字
- 如何设置数字格式以显示C 中的所有小数位数
- 如何解析小数分离器为结肠的数字的字符串表示:
- 获取存储为字符串的数字的小数部分
- 将十进制数字截断为最接近的4个小数和断言
- C++不显示小数位数的数字
- C++ 将数字的小数部分转换为整数
- 显示带小数位数的数字,而不是整数
- 你如何在数字上添加 2 位小数
- 在小数秒内仅用 3 位数字格式化 posix 时间
- 如何从 9 和 90 中提取 2.9 和 2.09,即获取数字等于最大编号的小数部分.二分位数之后的数字
- 两个数字相减时的小数
- 如何在C++中存储数字而不截断小数
- 使用'int'数据类型时出错,即使数字不是小数
- 用两个小数求3个数字的平均值(不舍入!)
- 为什么小数后面的数字都是零
- 由正整数或正小数组成的字符串,转换为I数字格式
- 如何使用std::cout停止输出像5.0这样的数字的小数和零?