Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;double/float的内部表示 我无法理解C++分区为什么会这样做。我有一个简单的程序,用1除以10(使用VS2003)_C++_Division - Fatal编程技术网

C++;double/float的内部表示 我无法理解C++分区为什么会这样做。我有一个简单的程序,用1除以10(使用VS2003)

C++;double/float的内部表示 我无法理解C++分区为什么会这样做。我有一个简单的程序,用1除以10(使用VS2003),c++,division,C++,Division,我期望dResult为0.1,但我得到0.100000000000001 为什么我会得到这个值,double/float的内部表示有什么问题 如何获得正确的值 谢谢。因为大多数现代处理器都使用二进制浮点,而二进制浮点不能精确表示0.1(无法用整数m和e将0.1表示为m*2^e) 如果您想查看“正确值”,可以打印出来,例如: printf("%.1f\n", dResult); 因为大多数现代处理器都使用二进制浮点,而二进制浮点不能精确表示0.1(无法用整数m和e表示0.1) 如果您想查看“正确

我期望dResult为0.1,但我得到0.100000000000001

  • 为什么我会得到这个值,double/float的内部表示有什么问题
  • 如何获得正确的值 谢谢。

    因为大多数现代处理器都使用二进制浮点,而二进制浮点不能精确表示0.1(无法用整数
    m
    e
    将0.1表示为
    m*2^e

    如果您想查看“正确值”,可以打印出来,例如:

    printf("%.1f\n", dResult);
    
    因为大多数现代处理器都使用二进制浮点,而二进制浮点不能精确表示0.1(无法用整数
    m
    e
    表示0.1)

    如果您想查看“正确值”,可以打印出来,例如:

    printf("%.1f\n", dResult);
    

    Double和float与实数不同,这是因为实数的值是无限的,但在Double/float中表示它们的位数是有限的


    您可以进一步阅读:

    Double和float与实数不同,这是因为实数的值是无限的,但在Double/float中表示它们的位数是有限的


    您可以进一步阅读:

    普遍存在的IEEE754浮点格式以科学符号base 2表示浮点数,并带有有限尾数。由于像1/5(因此1/10)这样的分数在二进制科学记数法中没有有限多位数的表示,因此无法精确表示值0.1。更一般地说,唯一可以精确表示的值是那些精确符合二进制科学记数法的值,尾数为几个(例如24、53或64)二进制数字,指数适当小。

    普遍存在的IEEE754浮点格式以科学记数法基数2表示浮点数,有一个有限尾数。由于像1/5(因此1/10)这样的分数在二进制科学记数法中没有有限多位数的表示,因此无法精确表示值0.1。更一般地说,唯一可以精确表示的值是那些精确符合二进制科学记数法的值,尾数为几个(例如24或53或64)二进制数字,指数适当小。

    处理整数、浮点数和双精度可能很棘手。这取决于你的目的。如果你只想以漂亮的格式显示,那么你可以玩C++ iMaNIPululor,精度,SkyPoT,NoWoWoStt。如果您试图用数值方法进行精确计算,可能需要使用一些库来精确表示。如果要将大量的小数值和大数值相乘,则可能必须解析以使用日志转换。下面是一个小测试:

      float x=1.0000001;
       cout << x << endl;
       float y=9.9999999999999;
       cout << "using default io format " << y/x << endl;
       cout << showpoint << "using showpoint " << y/x << endl;
       y=9.9999;
       cout <<  "fewer 9 default C++ " << y/x << endl;
       cout << showpoint << "fewer 9 showpoint" << y/x << endl;
    
    1
    using default io format 10
    using showpoint 10.0000
    fewer 9 default C++ 9.99990
    fewer 9 showpoint9.99990
    
    float x=1.0000001;
    
    cout处理整数、浮点和双精度可能很棘手。这取决于你的目的。如果你只想以漂亮的格式显示,那么你可以玩C++ iMaNIPululor,精度,SkyPoT,NoWoWoStt。如果您试图用数值方法进行精确计算,可能需要使用一些库来精确表示。如果要将大量的小数值和大数值相乘,则可能必须解析以使用日志转换。下面是一个小测试:

      float x=1.0000001;
       cout << x << endl;
       float y=9.9999999999999;
       cout << "using default io format " << y/x << endl;
       cout << showpoint << "using showpoint " << y/x << endl;
       y=9.9999;
       cout <<  "fewer 9 default C++ " << y/x << endl;
       cout << showpoint << "fewer 9 showpoint" << y/x << endl;
    
    1
    using default io format 10
    using showpoint 10.0000
    fewer 9 default C++ 9.99990
    fewer 9 showpoint9.99990
    
    float x=1.0000001;
    
    CUT C和C++使用,用二进制表示10个浮点数会导致你看不到的错误。code>0.1
    实际上在IEEE-754中不可表示。@Birryrree您确定吗?我认为这两个标准都定义了实现。现在很明显,在实践中,每个CPU都使用IEEE-754(至少或多或少),所以这无关紧要,但仍然..一个
    double
    有64位,所以它最多可以表示2^64个不同的数字<代码>0.1
    不是其中之一。就这么简单。@Voo-看看这个标准,看起来你是对的-C99附录F确实提到了IEEE-754支持,但C++03规定可能有不符合IEEE-754/IEC-559的专门化。不确定C++ +11链接是否已经在C和C++中使用了这个链接,使用二进制来表示10个浮点数字会导致你看不到的错误。code>0.1实际上在IEEE-754中不可表示。@Birryrree您确定吗?我认为这两个标准都定义了实现。现在很明显,在实践中,每个CPU都使用IEEE-754(至少或多或少),所以这无关紧要,但仍然..一个
    double
    有64位,所以它最多可以表示2^64个不同的数字<代码>0.1不是其中之一。就这么简单。@Voo-看看这个标准,看起来你是对的-C99附录F确实提到了IEEE-754支持,但C++03规定可能有不符合IEEE-754/IEC-559的专门化。关于C++11.Link to这篇文章中已经有一个链接,在回答这类问题时经常会被链接,但它并不是针对初学者的…@OliCharlesworth这是初学者不应该使用浮点的一个很好的理由。它没有按照他们期望的方式工作。(但之后,几乎可以说,关于C++的任何东西,或者任何其他的编程语言都是一样的。)他仍然有有理数,而不是非理性。@拉鲁:即使在[0,1]的范围内,也有无限数。[而且在任何一个不是单子的范围内]@James这在我看来有点苛刻。你可以用一种即使没有数学背景的人也能轻松理解问题的方式来解释fp数学的局限性。如果他们理解了简单的基本原理(你不能准确地表示所有的数字),他们就可以像其他人一样使用它。挑衅性:知道为什么我不能用FP来存储钱不是吗