它加上一个数之后,结果却是把小数点后第六位给舍弃了,为什么呢

关于浮点数精度的问题

单精度精确到小数点后六位,但为什么下面这个程序却把第六位舍弃了

    float b{ 0.000001 };
    float c{ 12345.0  };
        std::cout<<b<<std::endl;
    std::cout << std::fixed << b+c << std::endl;
b为单精度小数,输出0.000001,精确到小数点后第6位
但是它加上一个数之后,结果却是把小数点后第六位给舍弃了,为什么呢

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
这是由于浮点数的精度问题导致的。浮点数在内存中的存储方式是按照 IEEE 754 标准进行的,它使用二进制表示浮点数,并将其分成三个部分:符号位、指数位和尾数位。在单精度浮点数中,尾数位占用了 23 个二进制位,可以表示大约 7 位十进制数。

在这个例子中,0.000001 的二进制表示是 0.000000000000000000000001。当它加上 12345.0 时,由于指数位的影响,它最多只能精确到小数点后第 6 位。具体来说,根据 IEEE 754 标准,浮点数的运算是在指数相同的情况下进行的,因此在进行加法运算之前,0.000001 的指数位需要向上调整,以与 12345.0 的指数位相同。由于单精度浮点数的指数位占用了 8 个二进制位,因此最多只能表示 $2^8=256$ 种不同的指数,也就是说,相邻的指数之间的差值为 1。在这种情况下,0.000001 的指数位需要向上调整 16 个单位,因此它的小数点会向右移动 16 位,最终只能精确到小数点后第 6 位。

需要注意的是,浮点数的精度问题是由于其二进制表示方式和 IEEE 754 标准的限制导致的,这种问题在很多编程语言中都存在,而不仅仅是 C++。因此,在进行浮点数计算时,应该注意其精度问题,尽量避免在精度要求较高的场景中使用浮点数,或采用一些特殊的技巧来提高其精度。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7798784
  • 这篇博客你也可以参考下:输入一批字符串,将字符串按从小到大的顺序排序并且输出
  • 除此之外, 这篇博客: 【数据结构之栈和队列】熬夜暴肝,有亿点详细中的 栈与队列的应用 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在讲完栈与队列基础的东西之后我们就到有难度也是最实用的一个模块了,在讲应用之前先说一下它们各自的一些升华的知识。

    栈与队列输入输出

    在栈与队列中分别依次输入1,2,3,4它们的输出序列是什么呢?

    在队列中输出序列必定是1,2,3,4因为它是先进先出嘛

    但是栈中就不一定了。。

    如果是连续的输入与输出,那么栈输出的必然是4,3,2,1这也没有什么可以争论的,但是如果输入输出是不连续的就一定是这个答案了

    假设1先入栈,然后1立马就出栈了然后其他的数据也有变化,那么情况就很多很多了。

    对1,2,3,4组合排列可得:

    1234 1243 1324 1342 1423 1432
    2134 2143 2314 2341 2413 2431
    3124 3142 3214 3241 3412 3421
    4123 4132 4213 4231 4312 4321

    一共有24种,那么这24都可以作为栈的输出序列吗?

    并不是,有些是不合法的。

    譬如说4123

    想要4先出栈,那么入栈顺序必定是1,2,3,4如果4先出栈,那么接下来肯定是3,2,1依次出栈了。

    那么如果需要找到不合法的出栈序列这么多种我们要一个一个试吗?

    不需要我们有一个准则,如果不符合这个准则那么就必然是不合法的出栈顺序

    准则:出栈序列中每一个元素后面所有比它小的元素组成一个递减序列

    有多少种出栈序列我们有一个公式可以算出来,如下:
    在这里插入图片描述
    如果你想知道公式来由,你可以去出栈序列看看

  • 您还可以看一下 刘欢老师的从前端到后台,开发一个完整功能的小程序课程中的 搭建与设置服务器域名小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    问题分析:

    浮点数精度问题是因为浮点数的存储方式和数值范围的限制所导致的。因为浮点数在计算机中以二进制的形式存储,而二进制和十进制之间的转换存在精度丢失的问题,所以浮点数的精度有限。在进行浮点数计算时,如果数值范围超过了计算机所能表示的范围,就会出现舍入误差,导致精度丢失。

    解决方案:

    1.使用符合IEEE 754标准的浮点数库,如C++的库中的double类型。

    2.增加浮点数的精度,可以将浮点数转化为定点数,并在计算前进行精度扩展到更高的位数,最后将结果转换回浮点数。

    3.避免浮点数的精度问题,可以使用整数运算进行计算,或者使用以1为单位的小数进行计算,如采用整数代替小数计算、采用定点数代替浮点数计算等方法。

    示例代码:

    以下是一个使用库中的double类型解决浮点数精度问题的示例代码:

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    int main(){
        double a = 0.1;
        double b = 0.2;
        double c = a + b;
        cout << "a + b = " << c << endl; 
        return 0;
    }
    

    输出结果为:

    a + b = 0.3
    

    另外,需要注意在输出浮点数时,也可能会出现精度问题。可以通过设置输出的小数位数来保证输出的精度,如下所示:

    cout << fixed << setprecision(n) << value << endl;
    

    其中,n代表要输出的小数位数,value代表需要输出的浮点数。