- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 C 代码和 Python 代码之间(偶尔)得到略有不同的计算结果,并设法找到了一个例子。在 Python 中,我得到了这个:
>>> print "%.55f" %\
... (-2.499999999999999555910790149937383830547332763671875 *\
... -2.499999999999999555910790149937383830547332763671875)
6.2499999999999982236431605997495353221893310546875000000
>>> print "%.55f" %\
... ((-2.499999999999999555910790149937383830547332763671875) ** 2)
6.2499999999999973354647408996243029832839965820312500000
>>> print "%.55f" %\
... math.pow(-2.499999999999999555910790149937383830547332763671875, 2)
6.2499999999999973354647408996243029832839965820312500000
而在 C 中,以下程序:
#include<math.h>
#include<stdio.h>
int main(){
printf("%.55f\n", -2.499999999999999555910790149937383830547332763671875\
* -2.499999999999999555910790149937383830547332763671875);
printf("%.55f\n",\
pow(-2.499999999999999555910790149937383830547332763671875, 2));
return 0;
}
给出以下结果:
6.2499999999999982236431605997495353221893310546875000000
6.2499999999999982236431605997495353221893310546875000000
情况变得更糟。运行 bc -l
,我得到以下信息:
-2.499999999999999555910790149937383830547332763671875 *\
-2.499999999999999555910790149937383830547332763671875
6.249999999999997779553950749687116367962969071310727
这似乎是正确的结果; Casio's online high precision calculator同意。
然而,让我担心的是 (var * var)
、(var ** 2)
和 math.pow(var, 2)
偶尔会给出略有不同的结果(我使用的是 Python 2.7.6)。
有人知道为什么吗?
最佳答案
原因是您使用的是浮点值,这些值在设计上不是精确或精确 - Python 中的float
刚刚53 个有效位。对于这意味着什么,我建议您阅读文章 What Every Computer Scientist Should Know About Floating-Point Arithmetic或者稍微容易一点的What every computer programmer should know about floating point .
虽然在 Python 的情况下,也存在舍入误差:
# incorrect one is:
>>> (6.2499999999999973354647408996243029832839965820312500000).hex()
'0x1.8fffffffffffdp+2'
>>> (6.2499999999999982236431605997495353221893310546875000000).hex()
'0x1.8fffffffffffep+2'
准确的结果是什么时候
0x1.8fffffffffffd8000000000001p+2
注意舍入误差是与实际舍入点相差不到2^-100,即:
0x1.8fffffffffffd8000000000000p+2
应该四舍五入,而
0x1.8fffffffffffd7ffffffffffffp+2
应该向下舍入。我猜你的处理器在那里“错误地”舍入了值。
对于 C 程序,请注意 pow(-2.499999999999999555910790149937383830547332763671875, 2)
是一个常量值,它被完全消除,因此可以在没有 -lm 的情况下链接程序
用于数学库;我建议你试试这部分变量中的值:
volatile double a = -2.499999999999999555910790149937383830547332763671875;
printf("%.55f", pow(a, 2));
这可能会提供不同的结果。
但是Python也有一个任意精度的小数库,decimal.Decimal
:
with localcontext() as ctx:
# set the precision to 200 significant digits
ctx.prec = 200
result = decimal.Decimal(
'2.499999999999999555910790149937383830547332763671875') ** 2)
print(result)
打印
6.24999999999999777955395074968711636796296907131072793214132069
6557418301608777255751192569732666015625
这是正确的结果,不是你从 bc
得到的结果;在我的电脑上,bc -l
将比例设置为 20 位有效数字,但它可以通过 scale
变量进行调整:
% bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
scale = 200
2.499999999999999555910790149937383830547332763671875 * 2.499999999999999555910790149937383830547332763671875
6.249999999999997779553950749687116367962969071310727932141320696557\
418301608777255751192569732666015625
结果与 Python 相同。 (请注意,100 的精度不够,因为结果值有 104 位有效小数位)。
您也可以通过 python 检查数字,无需任何导入 - Python 也具有任意精度的整数运算:
>>> 2499999999999999555910790149937383830547332763671875 * \
... 2499999999999999555910790149937383830547332763671875
624999999999999777955395074968711636796296907131072793214132069
6557418301608777255751192569732666015625L
在 Python 3 中,您还可以轻松检查 float 的二进制表示形式:
>>> (2.499999999999999555910790149937383830547332763671875).hex()
'0x1.3ffffffffffffp+1'
这个数字的平方应该与具有相同数字平方的整数具有相同的数字:
>>> hex(0x13ffffffffffff * 0x13ffffffffffff)
'0x18fffffffffffd8000000000001'
但很明显,这不能仅用 53 个有效位来精确表示;相反,它需要两倍的位才能准确表示:
>>> log2(0x13ffffffffffff * 0x13ffffffffffff)
104.64385618977472
顺便说一下,由于 f
,这与十进制表示所需的非零数字的数量几乎相同:
>>> len('6249999999999997779553950749687116367962969071310727932141320696557418301608777255751192569732666015625')
103
关于python - 不同的平方值方法会导致输出略有不同——哪种方法最准确/可靠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28461469/
我正在尝试运行以下内容:: Press to see code - name: Snapshot BI nodes hosts: [CLUSTER-BI,CLUSTER-BI-REPL
在这里尝试心理重置:我尝试使用 MSMQ 创建一个可靠、持久的堆栈,但没有成功 所以更一般地说: 我有生产者(一个 web 服务,虽然“只有一个”,但也是多线程的)/消费者(多个进程,根据需要设置)。
试图为分布式系统找到一个商业日志框架。此框架必须允许远程服务器上的 .NET 应用程序记录可以在中央位置收集的消息。如果可能,中央位置应将消息存储在 SQL Server 数据库中。 要求: 能够在远
我正在开发 Restful 服务,我们将在数据库中插入/更新新记录。 由于REST使用HTTP进行通信,而HTTP并不可靠,我担心如果连接失败,请求可能无法发送到服务器。 我在 link 中找到的建议
我正在尝试实现一个页面,员工可以在其中登录并添加、修改、更新工作案例。 我有一个选择列表,其中包含从数据库加载的数据(员工姓名)。在这个数据库中,我有基本信息、用户名、ID、密码、电子邮件。 选择列表
我在 C 代码和 Python 代码之间(偶尔)得到略有不同的计算结果,并设法找到了一个例子。在 Python 中,我得到了这个: >>> print "%.55f" %\ ... (-2.49999
例如如果我将计时器设置为每天午夜到期,如果一个“失火”(例如,由于服务器关闭而不会触发回调)会发生什么?我在文档中找不到它。 有没有办法让这个定时器在服务器重启时立即触发回调? PS:我了解 Quar
我有一组不同长度的非零序列,我正在使用 Keras LSTM 对这些序列建模。我使用 Keras Tokenizer 进行分词(分词从 1 开始)。为了使序列具有相同的长度,我使用了填充。 填充示例:
我遇到了一个非常有趣的可靠 session 行为。我正在使用 netTcp 绑定(bind) + 双工 channel + 可靠 session 。 当我尝试在 channel.faulted 上收听
问题: 给定表 table_a 和 table_b,每当 table_a 更新时,我都需要可靠地(并发地)执行这样的操作: SELECT table_a 中的一些行。 在应用程序代码中计算一些内容。
我们目前的设计 环境 Redis 2.8.17 我们已经实现了我们的可靠队列,使用类似于 redis 文档中描述的模式的模式,在 RPOPLPUSH 下 但是,考虑到其阻塞性质,我们正在使用 BRPO
在我们的 WCF 应用程序中,我正在尝试配置可靠的 session 。 服务: 客户:
我使用这个 Delphi 7 代码来检测 Internet Explorer 是否正在运行: function IERunning: Boolean; begin Result := FindWi
我正在准备构建一个应用程序,该应用程序能够向 GPS 设备发送/接收航路点。通过一些谷歌搜索,我发现了很多可能对此目的有用的库: Java Chaeron GPS GPSLib4J Python Py
我有几个关于 WCF 可靠 session 可靠性的问题: WCF 是否在重试期间重新序列化消息? 2。如果 1 是正确的 - 它是否在消息参数被处理后发生? 3. 如果 2 是正确的 - 是否有任何
对于使用 $(this)[0].defaultValue 来确定文本框值是否已从原始值发生变化的一些反馈,我将不胜感激,例如 //keyUp event if($(this)[0].defaultVa
我正在开发一个具有以下特征的实时应用程序: 数百个客户端将同时插入行/文档,每个客户端每隔几秒插入一行。 大部分仅追加;几乎所有的行/文档,一旦插入,就永远不会改变。 只有当数据刷新到磁盘时,客户端才
场景:最终用户(不受信任的)提供了一个字符串,例如 "Hello, {name}!" .在服务器上,我想以 my_string.format(name="Homer") 的形式对该用户提供的字符串进行
我在推送通知方面遇到一些问题。我们使用 Firebase 来推送通知。问题是我可以在一台 iPhone 上正确接收 PushNotifications,但无法在另一台 iPhone 上接收它们。我在
从 python 到 c++,这是我能得到的最接近 python 的装饰器。 这个解决方案感觉有点像 hack,因为在要装饰的函数之后运行的代码在 Timer 析构函数中是隐式调用的。不过它确实有效。
我是一名优秀的程序员,十分优秀!