【问题标题】:C++ vs Python precisionC++ 与 Python 精度
【发布时间】:2010-10-02 16:45:38
【问题描述】:

尝试查找 num^num 的前 k 位的问题,我用 C++ 和 Python 编写了相同的程序

C++

long double intpart,num,f_digit,k;
cin>>num>>k;
f_digit= pow(10.0,modf(num*log10(num),&intpart)+k-1);
cout<<f_digit;

Python

(a,b) = modf(num*log10(num))
f_digits = pow(10,b+k-1)
print f_digits

输入

19423474 9

输出

C++    > 163074912
Python > 163074908

我检查了结果,C++ 解决方案是准确的。 在 http://www.wolframalpha.com/input/?i=19423474^19423474

知道如何在 Python 中获得相同的精度吗???

编辑:我知道外部库包以获得这种精度,但任何 NATIVE 解决方案???

【问题讨论】:

  • 奇怪的是它们完全不同,因为你会认为它们都使用相同的基本数学库 (math.h)、相同的底层协处理器和相同的底层IEEE 754 标准。但也许 python 重写了它自己的数字塔。
  • Wolfram alpha 表示最后几位数字是 2826110976,这不是您的 C++ 或 Python 代码的结果。
  • @sharth:他列出了几个数字,而不是最后几个数字。
  • @Will Hartung:它们不同,因为 C 代码使用 long double,而 Python 使用普通 C double

标签: c++ python floating-point precision floating-accuracy


【解决方案1】:

Decimal 是一个内置的 python 类,可以正确处理浮点数(作为基数 10,而不是作为 IEEE 7somethingsomething 标准)。我不知道它是否支持对数等等。

编辑:确实是support logarithms "and all that".

您也可以设置它的精度。默认为 28 个位置,但可以任意大。将其视为小数的 BigInt。

【讨论】:

    【解决方案2】:

    正如您所发现的,Python 浮点数实际上是双精度数。您将不得不求助于 C 代码或外部库来获得更好的浮点精度。

    GMP 库是一个不错的库,它有一个名为“GMPY”的 python 包装器,可在 PyPI 上找到

    【讨论】:

    • 任何编码竞赛都不允许使用任何外部 API,出于显而易见的原因,我更喜欢用 Python 编码。所以我想要一个可能的原生解决方案!!!
    【解决方案3】:

    一般来说,我会这样做。但是,对于您的示例数字,它的执行速度似乎不够快。

    num = 453
    k = 9
    result = num ** num
    
    print str(result)[:k]
    # Prints: '163111849'
    

    【讨论】:

      猜你喜欢
      • 2022-08-04
      • 2011-03-13
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 2015-10-31
      相关资源
      最近更新 更多