博客
关于我
浮点数精度问题——由Mathf.Floor()引发的思考
阅读量:503 次
发布时间:2019-03-07

本文共 1039 字,大约阅读时间需要 3 分钟。

浮点数精度问题在计算机编程中是一个常见且棘手的问题,尤其是在涉及金融、科学和工程领域的应用中。最近在项目中,我遇到了一个令人困惑的问题:在C#中,Mathf.Floor(9999.9995f)返回的是9999,而Mathf.Floor(9999.9996f)却返回10000。这看似矛盾的现象让我深入思考浮点数的精度问题及其背后的原理。

首先,我意识到这与浮点数的二进制表示有关。浮点数在计算机中以二进制形式存储,这意味着某些十进制数无法被精确表示为有限的二进制小数,导致精度丢失。例如,0.9995在十进制中无法被精确表示为有限的二进制小数,这可能导致在转换为单精度浮点数时,尾数部分出现舍入误差。

接下来,我回顾了IEEE754标准,了解单精度浮点数的结构。单精度浮点数占32位,其中包括符号位(1位)、阶码(8位)和尾数(23位)。阶码确定数的大小,尾数表示小数部分的位置。由于尾数位数有限,单精度浮点数只能近似表示某些数值,可能导致精度问题。

然后,我深入研究了舍入规则,这是精度问题的关键。对于单精度浮点数,舍入规则如下:

  • 当尾数第24位为0时,直接保留前23位,不进位。
  • 当尾数第24位为1,且尾数24位之后的位数不全为0时,保留前23位,之后尾数第23位加1。
  • 当尾数第24位为1,且尾数24位之后的位数全为0时,如果尾数第23位为0,则直接保留前23位,不进位。
  • 当尾数第24位为1,且尾数24位之后的位数全为0时,如果尾数第23位为1,则保留前23位,之后尾数第23位加1。
  • 在9999.9995f的情况下,尾数部分的舍入可能未达到进位的阈值,而9999.9996f则触发了舍入规则,导致结果变为10000。这说明了舍入规则对结果的重要影响。

    此外,浮点数运算中的舍入误差不仅影响了结果,还可能导致一些看似矛盾的现象,如0.1f + 0.2f不等于0.3f。这些问题提醒我在进行浮点数运算时,需要考虑精度问题,并采取措施避免误差对程序的影响。

    为了更好地理解这些问题,我尝试将9999.9995和9999.9996转换为二进制形式,观察它们在单精度浮点数表示下的变化。这有助于我直观地理解舍入规则如何影响最终结果。

    最后,我总结了解决浮点数精度问题的方法,包括使用双精度浮点数、在关键计算前进行适当的四舍五入,以及采用其他数值表示方法提高精度。通过深入理解浮点数的底层原理和舍入规则,我能够更好地预测并避免在程序中出现的精度问题,从而提升程序的准确性和可靠性。

    转载地址:http://qkxcz.baihongyu.com/

    你可能感兴趣的文章
    python+requests+unittest执行自动化接口测试!
    查看>>
    Python+Requests编码识别Bug
    查看>>
    python函数编写_[零基础学python]传说中的函数编写条规
    查看>>
    Python+selenium —— UI自动化之鼠标操作
    查看>>
    python函数注释,参数后面加冒号:,函数后面的箭头→是什么?
    查看>>
    Python+Selenium+Threading进行兼容性测试
    查看>>
    Python+selenium+unittest的GUI自动化框架实现
    查看>>
    python函数拟合不规则曲线_Python计算&绘图——曲线拟合问题(转)
    查看>>
    python函数定义的基本格式_零基础学python-2.19 定义函数、调用函数与默认参数
    查看>>
    Python+Selenium之数据驱动测试的实现
    查看>>
    python函数定义与使用+返回值简解
    查看>>
    Python+Selenium登录
    查看>>
    Python日期时间模块
    查看>>
    Python函数合集:足足68个内置函数请收好!
    查看>>
    Python+Selenium自动化测试项目实战
    查看>>
    Python+Selenium自动化测试项目实战【建议收藏】
    查看>>
    Python+Selenium自动化测试:Page Object模式
    查看>>
    python+selenium进行cnblog的自动化登录测试
    查看>>
    Python函数只返回第一个值而不是数据框
    查看>>
    Python+SQL实战:京东用户行为数据分析案例解析(上)
    查看>>