- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
问题动机:
在我知道的标准数值语言中(例如 Matlab、Python numpy 等),例如,如果您取一个适度大数的指数,则作为数值溢出的结果,输出是无穷大。如果将其乘以 0,则会得到 NaN。另外,这些步骤足够合理,但它们揭示了数学实现中的逻辑错误。已知溢出产生的第一个数字是有限的,我们显然希望用这个大的有限数字乘以 0 的结果是 0。
明确:
>>> import numpy as np
>>> np.exp(709)*0
0.0
>>> np.exp(710)*0
nan
最佳答案
所以......我很好奇并四处挖掘了一下。
正如我在评论中已经提到的,如果您考虑 exception status flags,IEEE 754 中存在“最大有限值”类型。 .设置了溢出标志的无穷大值对应于您建议的 LFV,不同之处在于该标志只能在操作后读出,而不是作为值本身的一部分存储。这意味着您必须手动检查标志并在发生溢出时采取行动,而不仅仅是内置 LFV*0 = 0。
有一个很有趣的paper关于异常处理及其在编程语言中的支持。引用:
The IEEE 754 model of setting a flag and returning an infinity or a quiet NaN assumes that the user tests the status frequently (or at least appropriately.) Diagnosing what the original problem was requires the user to check all results for exceptional values, which in turn assumes that they are percolated through all operations, so that erroneous data can be flagged. Given these assumptions, everything should work, but unfortunately they are not very realistic.
seterr
使其在溢出时引发异常:
import numpy as np
def exp_then_mult_naive(a, b):
err = np.seterr(all='ignore')
x = np.exp(a) * b
np.seterr(**err)
return x
def exp_then_mult_check_zero(a, b):
err = np.seterr(all='ignore', over='raise')
try:
x = np.exp(a)
return x * b
except FloatingPointError:
if b == 0:
return 0
else:
return exp_then_mult_naive(a, b)
finally:
np.seterr(**err)
def exp_then_mult_scaling(a, b):
err = np.seterr(all='ignore', over='raise')
e = np.exp(1)
while abs(b) < 1:
try:
x = np.exp(a) * b
break
except FloatingPointError:
a -= 1
b *= e
else:
x = exp_then_mult_naive(a, b)
np.seterr(**err)
return x
large = np.float_(710)
tiny = np.float_(0.01)
zero = np.float_(0.0)
print('naive: e**710 * 0 = {}'.format(exp_then_mult_naive(large, zero)))
print('check zero: e**710 * 0 = {}'
.format(exp_then_mult_check_zero(large, zero)))
print('check zero: e**710 * 0.01 = {}'
.format(exp_then_mult_check_zero(large, tiny)))
print('scaling: e**710 * 0.01 = {}'.format(exp_then_mult_scaling(large, tiny)))
# output:
# naive: e**710 * 0 = nan
# check zero: e**710 * 0 = 0
# check zero: e**710 * 0.01 = inf
# scaling: e**710 * 0.01 = 2.233994766161711e+306
exp_then_mult_naive
做你所做的:将溢出的表达式乘以 0
你会得到一个 nan
. exp_then_mult_check_zero
捕获溢出并返回 0
如果第二个参数是 0
, 否则与原始版本相同(注意 inf * 0 == nan
而 inf * positive_value == inf
)。如果存在 LFV 常数,这是您能做的最好的事情。 exp_then_mult_scaling
使用有关问题的信息来获取其他两个无法处理的输入结果:if b
很小,我们可以在递减a
的同时乘以e不改变结果。所以如果 np.exp(a) < np.inf
之前 b >= 1
,结果符合。 (我知道我可以在一个步骤中检查它是否适合而不是使用循环,但现在编写起来更容易。)seterr
的线程安全性.因此,如果您在多个线程中使用它并在每个线程中使用不同的设置,请先对其进行测试以避免以后头痛。
[...] the more esoteric features of the IEEE 754 standard discussed here, such as extended formats, NaN, infinities, subnormals etc. [...] are designed to give safe robust defaults for numerically unsophisticated programmers, in addition to supporting sophisticated numerical libraries by experts.
关于python - 数字编程语言是否区分 "largest finite number"和 "infinity"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29859509/
有人尝试过两者J编程语言形式 jsoftware 和 R语言。经过一番搜索后,我遇到了 incanter这是基于 Clojure 的。我想学习一种用于数据分析的统计语言。你更倾向哪个?为什么? 请考虑
有谁知道我在哪里可以找到 NesC 编程语言的基础和高级教程和代码示例。 最好的问候 最佳答案 在这里您可以找到许多示例和许多其他文档。 http://docs.tinyos.net 关于NesC 编
我断断续续地玩 MUD 游戏已经一年多了。我在网上搜索了最好的计算机语言来学习开发我自己的语言。到目前为止,我除了 C 什么都没有想出。C 是学习此应用程序的最佳语言,还是有更好的语言? 我知道 SM
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我对编码有点陌生,可能不会使用正确的术语,希望我说的有道理。 我创建了一个类模块来构建对象。我的类模块当前有一些变量(我打算在构建代码时添加一些方法)。 'CLASS MODULE NAMED cls
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
问题:这个代码示例有什么问题,缺少什么? 当前不正确的输出是: “”中有0个字 代码说明:编写一个程序,读取一行文本,并打印出该行文本中的字数。单词包含字母数字字符。提示:使用 fgets() 函数。
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
任何人都可以回答如何在 GO 中获取系统时间来帮助我。例如,在下面的代码中,我想知道第一次打印和第二次打印语句何时执行,它们之间的时间差是多少。 package main import "fmt" f
Pyret 是一门基于 JavaScript 的脚本语言,旨在成为编程教育的绝佳选择,同时探索脚本语言和函数式编程的融合。目前 Pyret 正处于积极设计和开发阶段,开发者可以自由使用或对其进行修改
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 去年关闭。 Improve this
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 8年前关闭。 Improve this qu
在过去的几年里,我一直在做大量的 SIMD 编程,而且大部分时间我一直依靠编译器的内在函数(例如用于 SSE 编程的那些)或编程汇编来获得真正漂亮的东西。然而,到目前为止,我几乎找不到任何内置支持 S
当我尝试使用 watir-webdriver 步骤定义运行 Cucumber 场景时,出现以下错误: Failed to load 'yml' programming language for fil
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 2年前关闭。 Improve this questi
我想知道是否有一种编程语言可以编译为机器代码/二进制(不是字节码,然后由 VM 执行,在考虑打字时这是完全不同的),具有动态和/或弱类型,例如: 想想一种编译语言,其中: 变量不需要声明 可以在运行时
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我是一名优秀的程序员,十分优秀!