博客
关于我
浮点数精度问题——由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/

    你可能感兴趣的文章
    Pip 安装挂起
    查看>>
    pip 或 pip3 为 Python 3 安装包?
    查看>>
    pip 文件损坏导致 pip无法使用 报错 ImportError: cannot import name 'main' from 'pip._int
    查看>>
    pip 无法从 requirements.txt 安装软件包
    查看>>
    pip/pip3更换国内源
    查看>>
    pip3 install PyQt5 --user 失败
    查看>>
    pip3命令全解析:Python3包管理工具的详细使用指南
    查看>>
    pip3安装命令重复创建文件‘/tmp/pip-install-xxxxx/package‘失败
    查看>>
    PIPE 接口信号列表
    查看>>
    pipeline配置与管理Job企业级实战
    查看>>
    pipeline项目配置实战
    查看>>
    Pipenv 与 Conda?
    查看>>
    QVGA/HVGA/WVGA/FWVGA分辨率屏含义及大小//Android虚拟机分辨率
    查看>>
    pipreqs : 无法将“pipreqs”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径 正确,然后再试一次。
    查看>>
    pipy国内镜像的网址
    查看>>
    quiver绘制python语言
    查看>>
    pip下载缓慢
    查看>>
    PIP使用SSH从BitBucket安装自定义软件包,无需输入SSH密码
    查看>>
    pip命令提示unknow or unsupported command install解决方法
    查看>>
    pip在安装模块时提示Read timed out
    查看>>