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

    你可能感兴趣的文章
    PANDA:基于多列对数据表的行运行计算,并将输出存储在新列中
    查看>>
    PandoraFMS 监控软件 SQL注入漏洞复现
    查看>>
    PandoraFMS 监控软件 任意文件上传漏洞复现
    查看>>
    PanTools多网盘登录神器
    查看>>
    Papyrus项目常见问题解决方案
    查看>>
    Parallel.ForEach使用示例
    查看>>
    Parallel.ForEach的基础使用
    查看>>
    parallels desktop for mac安装虚拟机 之parallelsdesktop密钥 以及 parallels desktop安装win10的办公推荐可以提高办公效率...
    查看>>
    parallelStream导致LinkedList遍历时空指针的问题
    查看>>
    Parameter ‘password‘ not found. Available parameters are [md5String, param1, username, param2]
    查看>>
    ParameterizedThreadStart task
    查看>>
    Paramiko exec_命令的实时输出
    查看>>
    Spring security之管理session
    查看>>
    paramiko模块
    查看>>
    param[:]=param-lr*param.grad/batch_size的理解
    查看>>
    spring mvc excludePathPatterns失效 如何解决spring拦截器失效 excludePathPatterns忽略失效 拦截器失效 spring免验证拦截器不起作用
    查看>>
    Spring Cloud 之注册中心 EurekaServerAutoConfiguration源码分析
    查看>>
    Parrot OS 6.2 重磅发布!推出全新 Docker 容器启动器
    查看>>
    Parrot OS 6.3 发布!全面提升安全性,新增先进工具,带来更高性能
    查看>>
    ParseChat应用源码ios版
    查看>>