双数据类型解释错误
Interpretation error of double data type
我使用键盘上的std::cin
读取double
值,设该值为1.15。当我在读取值后放置断点时,visual studio显示该值为1.14999999。但是如果我把它打印出来,它会在我的控制台上显示1.15。后来我写了下面的代码,它没有工作好
int main()
{
long double valueA;
int required;
std::cin>>valueA;
required=(valueA*10000)-(((int)valueA)*10000);
std::cout<<(required);
}
当输入为1.015时,输出为149,但期望输出为150。为什么我的编译器认为1.015为1.014999999?我怎样才能纠正这个错误呢?
您所描述的是浮点错误。这是因为浮点数在硬件级别的表示方式(见这里)。基本上,一个浮点数被保存为sme,并被重构为s * m * 2 ^ e,其中^是s的幂,如果s位为0,则s为1,如果s位为1,则为-1。
如果你需要这种精度,你可以使用十进制算术库,这或多或少是一样的,但不是使用2的幂,而是使用10的幂,因为它们是在软件中实现的,这意味着它们可以有任意的精度(更多关于这里)。
下面是一个可以使用的实现十进制运算的库列表:
- gmp - https://gmplib.org/
- qdecimal - https://code.google.com/p/qdecimal/
- intel decimal- https://software.intel.com/en-us/articles/intel-decimal-floating-point-math-library/
相关文章:
- 你能解释一下什么运行时错误是如何解决它的吗?
- 隐式重新解释引用时强制转换,没有警告/错误
- 野牛/flex:计算器将双精度值解释为整数,所以我添加了 YYSTYPE 双精度 #define 但我有多个编译错误
- 如何解释此错误、堆摘要、单元化变量?
- VS2019编译器将没有BOM文件的UTF8错误解释为ANSI
- 全球免费给出一个错误.调试器不解释
- 作者在解释C 中的堆栈和堆时犯了一个错误,或者我正在误读某些内容
- 在 c++ 程序中调试链表以添加两个数字: 有人可以解释为什么 l3=l3->next;导致错误?
- 如何解释GDB回溯以确定分段错误?
- 联合 int 位到浮点位有时解释错误
- C 无法解释的类“尚未声明”错误,这是由于名称空间而导致的
- C 功能具有参考参数错误的迭代器错误.寻求解释
- 当我做出语句 root->right->right = newnode(7);注释,编译器显示运行时错误。谁能解释为什么?
- 如何解释 CUDA 的内联 PTX 内部编译器错误
- C++解释此删除[]错误
- std::忽略编译器错误的解释
- 使用boost multiprecision/mpfr float-字符串不能被解释为有效的整数错误
- 无法解释的链接器错误
- gcc编译错误,对象初始化被解释为函数指针
- C++中一些无法解释的错误