zoukankan      html  css  js  c++  java
  • C++ float vs double

    精度

    相比 floatdouble 从其名字上已经展示出,它的精度是前者的两倍,他们的精度分别为:

    • float: 7 位数字
    • double: 15 位数字

    可通过如下的示例看出,在重复进行计算时,精度差异开始显现:

    float a = 1.f / 81;
    float b = 0;
    for (int i = 0; i < 729; ++ i)
        b += a;
    printf("%.7g
    ", b); // prints 9.000023
    double a = 1.0 / 81;
    double b = 0;
    for (int i = 0; i < 729; ++ i)
        b += a;
    printf("%.15g
    ", b); // prints 8.99999999999996

    尽管如此,double 也不是十分精确,所以还有 long double 类型,该类型下上面的结果为 9.000000000000000066。所有浮点型都面临精度丢失的问题,所以处理高精度的场景,比如涉及金钱,最好用 int 或单独的分数类(fraction class)。

    上限

    两者上限不同,

    • float: 3e38
    • double: 1.7e308

    所以使用 float 出现瓶颈的概率会比 double 大些,特别是计算阶乘这种情况下。

    选择

    而关于两者的选择,《C++ Primer》 是这样描述的:

    “Use double for floating-point computations; float usually does not have enough precision, and the cost of double-precision calculations versus single-precision is negligible. In fact, on some machines, double-precision operations are faster than single. The precision offered by long double usually is unnecessary and often entails considerable run-time cost.”

    --Stanley B. Lippman. “C++ Primer, Fifth Edition (Jason Arnold's Library).”

    鉴于 float 精度不够,对于有小数的情况建议使用 double。但考虑到性能, long double 性价比就不高了。

    相关资源

  • 相关阅读:
    Rsync+inotify自动同步数据
    join和 Daemon守护线程
    多线程的简单演示
    DB2用一张表更新其他表的数据
    WebService到底是什?
    JqueryUI学习笔记-自动完成autocomplete
    DB2 SQLCODE 大全
    eclipse调试java程序的九个技巧
    Class和ClassLoader的getResourceAsStream区别
    linux下vi命令大全
  • 原文地址:https://www.cnblogs.com/Wayou/p/double_and_float_in_cpp.html
Copyright © 2011-2022 走看看