代码之家  ›  专栏  ›  技术社区  ›  Entity

C高双精度

  •  5
  • Entity  · 技术社区  · 14 年前

    我正在编写一个函数,它计算pi的值,并将其作为double返回。到现在为止,一直都还不错。但一旦函数在小数点后达到14位,它就不能再保持下去了。我想这是因为双精度精度有限。我该怎么做才能在小数点后继续得到更多的数字?

    6 回复  |  直到 14 年前
        1
  •  16
  •   Eric Lippert    14 年前

    我一点也不想用浮点运算。

    记住,您的算法是:

    (1 + 1 / (2 * 1 + 1)) *  
    (1 + 2 / (2 * 2 + 1)) *  
    (1 + 3 / (2 * 3 + 1)) *  
    (1 + 4 / (2 * 4 + 1)) *  
    (1 + 5 / (2 * 5 + 1)) *  
    (1 + 6 / (2 * 6 + 1)) *  
    (1 + 7 / (2 * 7 + 1)) *  ...
    

    在计算分数的过程中的每个阶段。为什么不简单地保持分数的分子/分母形式呢?要计算的分数是:

    (4 / 3) * 
    (7 / 5) *
    (10 / 7) *
    (13 / 9) * ...
    

    只有4*7*10*13…顶部为3*5*7*9,底部为3*5*7*9。

    为自己准备一个biginteger类(其中一个类在system.numerics中带有4.0框架),您可以轻松地计算出分子和分母,只要您愿意。然后你就有了把商转换成十进制的问题。这很容易。想必 你知道怎么做长除法 . 只需在分子和分母上实现一个长除法,就可以算出所需的位数。

        2
  •  8
  •   LukeH    14 年前

    你需要多少精度?

    使用 decimal 会给你大约28个小数位:

    decimal pi = 3.14159265358979323846264338327950288419716939937510m;
    Console.WriteLine(pi);    // 3.1415926535897932384626433833
    

    如果这对您来说还不够,那么您需要搜索某种bigdecimal实现,或者查看执行计算的其他技术。

        3
  •  1
  •   Klaus Byskov Pedersen    14 年前

    有几个库允许您以任意精度工作。一个是 W3b.sine ,但其他一些在 wikipedia .

        4
  •  1
  •   user472875    14 年前

    尝试 decimal

        5
  •  0
  •   Jim Mischel    14 年前

        6
  •  0
  •   Community CDub    8 年前

    BigDecimal this answer