澄清了双精度数据类型的使用
Clarification on the usage of double datatype
我是C++初学者,在研究双精度和浮点数之间的区别时,我遇到了 https://www.thoughtco.com/definition-of-double-958065
现在,根据这个网站,"双精度类型可以表示分数和整数值。它总共最多可以包含 15 位数字,包括小数点之前和之后的数字。">
所以如果我想存储一个值,比如说,33.53287,我应该能够做到这一点。但是当我这样做并打印我的变量时,它给了我输出 33.5329 . 为什么会这样? 根据上面提到的行,只要我们包含少于 15 位数字,我们就应该没问题。但为什么会有这样的结果呢?
另外,我读到双精度比浮点数更精确。但是如果我在我的代码中用浮点数替换双精度,我会得到相同的结果。那么我怎么能说双精度比浮点更精确呢?
不仅如此,如果我用更大的 14 位数字(包括小数点前后的数字)替换我的数字,我会得到 3.88889e+008 的答案 但是,如果我用 int 替换 double,我会得到388888883。 显然,使用 int 作为数据类型获得的结果比使用 double 作为数据类型获得的结果更精确。同样,这是违反直觉的,因为 int 占用 4 个字节,而双 8 字节。
我看过许多关于数据类型双精度的文本,但没有一个可以消除我的困惑。
-了解数据类型双精度
- 浮点数和双精度有什么区别?
- https://www.geeksforgeeks.org/difference-float-double-c-cpp/
-
C++双精度和浮动型的不同输出
#include <iostream> using namespace std; int main () { double x=33.53287; cout << x ; return 0; } #include <iostream> using namespace std; int main () { double x=388888883.53287; cout << x ; return 0; }
所以基本上问题是
为什么双精度不给出 33.53287作为输出,而是给出 33.5329 尽管非常精确。
-
即使浮点给出相同的输出,为什么它不如双精度精确?
-
为什么不用第二个代码重复打印整个数字 - 为什么 int 更多 在这种情况下,精确比双倍。
您对数据类型的看法是正确的,但您没有考虑cout
的工作方式。流具有许多格式选项,默认情况下,它们为您提供的有效数字比您在这种情况下要查找的有效数字要少。他们试图对此保持聪明,但不可能自动满足所有需求。
要获得您想要的,请尝试std::fixed
I/O 操纵器:
#include <iostream>
#include <iomanip>
using namespace std;
int main ()
{
double x=388888883.53287;
cout << std::fixed << x ;
return 0;
}
// Output: 388888883.532870
(现场演示)
更一般地说,当您想要对程序中的数据进行取证检查时,请尝试使用调试器而不是流。这样可以防止外部因素在您不知不觉中影响您的结果!
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 使用从文件(stod、strtod、atof)中提取的数据C++从字符串转换为双精度.csv
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 将不同类型的模板参数包提取到双精度向量中会产生警告
- 为什么双精度数据类型在C++中出错?
- 警告:左移计数 >= 在 C++ 中将字节流读取为双精度变量时的类型宽度
- 从双精度转换为整数的显式类型是否始终检查整数溢出?
- "+=" 操作在类型之间不起作用 std::复杂<double>和__complex__双精度
- 将双精度值分配给 int 数组时的类型转换
- if(双精度类型 == 字符类型)
- 如何随机化双精度/浮点数据类型? C++
- 澄清了双精度数据类型的使用
- 为什么我的气泡排序不适用于双精度数据类型?
- C++ 错误错误:数组下标的类型"双精度 [10][10][double]"无效
- 具有 IEEE 754 浮点双精度数据类型的安全往返整数值
- 小数、双精度、整数等数据类型的范围
- c++ 如何计算涉及双精度数据类型模数的数学表达式
- 无法将成员函数从类型"双精度(类一::)()"转换为类型"双精度(类一::*)()"
- 添加字节*数据到双精度向量
- 从双精度数据类型获取特定整数的方法