- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试在 python 2.7 中使用 Bigfloat 库。
from bigfloat import *
f1 = Context(precision=2000)
with precision(2000): f1 = 1e-19*1e-19*9e9/((1-1e-18)*(1-1e-18))-1e-19*1e-19*9e9
with precision(100): f2 = 1.6e-27*1.6e-27*6.6e-11/(1e-18*1e-18)
print BigFloat(f1) print f2
Python 给了我 f1=0
,但这不是真的。我用g++测试了它,结果是1.75e-46
。
是我的程序出错了吗?是否无法使用 Bigfloat 计算此精度?是lib中的错误吗?
最佳答案
作为示例,以下是您如何使用 bigfloat
库将 f1
计算为 256 位精度。
>>> from bigfloat import BigFloat, precision
>>> with precision(256):
... x = BigFloat('1e-19')
... y = BigFloat('9e9')
... z = BigFloat('1e-18')
... f1 = x * x * y / ((1 - z) * (1 - z)) - x * x * y
...
>>> f1
BigFloat.exact('1.800000000000000002700000000000000003600000000000000004500006811997284879750608e-46', precision=256)
请注意 BigFloat('1e-19')
的使用,它以当前精度(256 位)创建最接近 10**-19
的二进制 float )。这与 BigFloat(1e-19)
(不带单引号)不同,因为 1e-19
是 Python float ,因此已四舍五入为 53 位精度。
看看documentation了解更多详情。
但是,只要有一点创造力和代数,您就根本不需要高精度库。您可以将 f1
的表达式重写为:
f1 = x * x * y * (1 / ((1 - z) * (1 - z)) - 1)
通过将所有内容放在一个公分母上,括号中的数量可以重写为 (2 - z) * z/((1 - z) * (1 - z))
。因此,您同样可以将 f1
计算为:
f1 = x * x * y * (2-z) * z / ((1 - z) * (1 - z))
在这种形式中,当 z
非常小时,您不会失去准确性。所以现在常规的 Python float 就足够了:
>>> x = 1e-19
>>> y = 9e9
>>> z = 1e-18
>>> f1 = x * x * y * (2 - z) * z / ((1 - z) * (1 - z))
>>> f1
1.8e-46
如果您确实决定要使用高精度浮点库,我还建议您查看 gmpy2图书馆。它基于与 bigfloat 相同的底层 MPFR 库,但维护得更好。
关于python - Bigfloat - 精度错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30963288/
是否可以生成 BigFloat 的随机数?类型均匀分布在区间 [0,1)? 我的意思是,因为 rand(BigFloat)不可用,看来我们必须使用 BigFloat(rand())为了那个结局。然而,
在 Julia 中,有人实现了正态分布 pdf 或 cdf 来支持任意精度的 BigFloats。 例如,此代码返回 0.0,而实际上这些值应该略有不同。 x = parse(BigFloat, "2
我正在尝试在我的 Mac (OS X 10.8.4) 上安装软件包“bigfloat”,但遇到了一些问题。 “bigfloat”包需要另外两个依赖项:1) mpfr 和 2) gmp。 我在这里安装了
我正在尝试在 python 2.7 中使用 Bigfloat 库。 from bigfloat import * f1 = Context(precision=2000) with precision
我想获取 BigFloat 的二进制数字数字。我认为最简单的方法是将数字转换为字节数组。在 this question有一种方法可以为 Float64 做到这一点,但是当我为 BigFloat 尝试相
我正在寻找一个快速的 BigFloat 单元,它可以处理加法、减法、乘法和除法(对数可以,但不是必需的),并且精度至少为 100 位小数。我试过this单位,但它比标准扩展操作慢大约 1,000 倍。
我不确定这是否是一个错误。但是我一直在玩big我不明白为什么这段代码会这样工作: https://carc.in/#/r/2w96 代码 require "big" x = BigInt.new(1
我想在 Julia 中对 BigFloats 数组执行 FFT,但到目前为止我无法实现。我找到了 FFTW.jl并按照他们的文档中的说明进行操作(importall FFTW 等)。遗憾的是,这没有帮
据我了解,阅读 Math::BigFloat 的文档,以下应该是对数字进行四舍五入的代码,但它似乎不起作用。 #!/usr/bin/perl use strict; use warnings; use
我正在尝试将 bigfloat Python 包安装到我的 mac 上,但我不太擅长这类事情。 我已经按照描述下载了最新的包 here .文档说: In order to use the bigflo
我正在尝试在 Windows 8 机器上为 python 3.4 安装 Bigfloat。我已经看到许多其他问题询问如何安装它,但似乎没有任何效果。 Pip 和 easy_install 给我错误:没
我将对键值对使用 Redis 的 INCRBYFLOAT 命令。但是,我从 BigFloat 类型中检索了值。我不确定我是否可以直接将 BigFloat 变量传递给该命令。如果不是,如何将其转换为普通
System.Numerics.BigInteger 可让您将大整数相乘,但是否有相同类型的 float ?如果没有,是否有我可以使用的免费图书馆? //this but with floats Sy
在 Julia 1.0.0 REPL 中,我得到以下结果: # Line 1: This make sense. I did not expect a Float64 to equal a BigF
F# 中是否有一种数据类型可以让我计算任意/大量小数位的 float ?类似于 BigInt 的 float 。 我想做类似的事情 myLargeFloat = 1.0/7.0 printfn "
好吧,从表面上看,我有一个简单的问题。我想将无理数的小数部分取到指定的位数并将其视为整数。例如,如果我的无理数是 2.657829……而我想要五位数字,那么我正在寻找 65782(尽管我实际上是在处理
我正在尝试在 Windows 7 机器上的 Python 3.2 中安装 bigfloat。文档说我首先需要安装 GMP 和 MPFR。我已经将这两个下载到我的 table 面(以及 bigflo
我正在尝试在 OSX Sierra 中安装 bigfloat: pip install bigfloat 但是我收到这个错误: mpfr.c:343:10: fatal error: 'gmp
我是一名优秀的程序员,十分优秀!