问题标签 [underflow]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
4521 浏览

android - Canvas restore() 在极少数情况下导致下溢异常

通过 ACRA,我收到了少量来自 alpha 版本软件的报告,这些报告表明在特定调用Canvas.restore(). 例外是java.lang.IllegalStateException: Underflow in restore

我很清楚,如果restore()拨打电话的次数多于save()通话次数,则会发生此异常。但是,通过非常仔细的代码检查,我绝对可以肯定所有对canvas.save()和的调用canvas.restore()都是平衡的。也就是说,所有对canvas.save()的调用肯定会在稍后阶段通过对 的调用来平衡canvas.restore()。我还可以确认没有可能导致丢失canvas.save()导致堆栈下溢的方法的条件、异常或提前返回。

此外,这个问题似乎是一种罕见的边缘情况,它导致在每秒渲染多次的图形代码中仅发生几次异常。

发生这种情况的代码结构是:

有些地方save()/restore()在循环中使用,但调用也是平衡的。

报告来自运行 4.3 和 4.4.2 的设备。

我试图用谷歌搜索这个问题,我能找到的唯一有趣的 QA 来自一个在他的代码中显然有不平衡的 save() / restore() 调用的人;这绝对不是我的问题。

这发生在自定义 View 子类的onDraw(Canvas canvas)方法的调用堆栈中,所有这些都发生在 UI 线程上。我没有接触过该Canvas对象的其他线程。

getSaveCount()在调用负责异常的特定 restore() 之前,我可能会通过调用来检查堆栈,但这实际上只是在问题上坚持使用 Elastoplast。我宁愿了解导致下溢的边缘情况到底是什么,但这让我感到困惑。

是否有任何已知问题?Canvas当 UI 线程在 aViewonDraw()调用上下文中时,任何类型的系统配置更改都可能影响这一点吗?Canvas堆栈大小是否有任何已知限制?是否存在已知滥用画布堆栈的任何操作系统图形调用?

0 投票
3 回答
2454 浏览

gcc - 减法和检测下溢,最有效的方法?(带有 GCC 的 x86/64)

我正在使用 GCC 4.8.1 编译 C 代码,我需要检测 x86/64 架构的减法中是否发生下溢。两者都是未签名的。我知道在汇编中很容易,但我想知道我是否可以在 C 代码中完成它并让 GCC 以某种方式对其进行优化,因为我找不到它。这是一个非常常用的功能(或低级,是这个词吗?)所以我需要它高效,但 GCC 似乎太笨了,无法识别这个简单的操作?我尝试了很多方法在 C 中给它提示,但它总是使用两个寄存器,而不仅仅是一个 sub 和一个条件跳转。老实说,看到如此愚蠢的代码编写了很多次(函数被调用了很多次),我感到很恼火。

我在 C 语言中的最佳方法似乎如下:

基本上,从 a 中减去 b,如果结果下溢检测到它并进行一些条件处理(这与 a 的值无关,例如,它会带来错误等)。

GCC 似乎太笨了,无法将上述内容简化为子跳转和条件跳转,相信我,我尝试了很多方法在 C 代码中执行此操作,并尝试了很多命令行选项(当然包括 -O3 和 -Os)。GCC 所做的事情是这样的(英特尔语法汇编):

不用说上面是愚蠢的,当它所需要的只是:

这太烦人了,因为 GCC 确实理解 sub 以这种方式修改标志,因为如果我将其类型转换为“int”,它将生成与上面完全相同的内容,除了它使用带有符号跳转的“js”,而不是进位,这不会如果无符号值差异足够高以设置高位,则工作。尽管如此,它表明它知道影响这些标志的子指令。

现在,也许我应该放弃尝试让 GCC 正确优化它并使用我没有问题的内联汇编来完成它。不幸的是,这需要“asm goto”,因为我需要有条件的 JUMP,而 asm goto 的输出效率不是很高,因为它是易变的。

我尝试了一些东西,但我不知道使用它是否“安全”。asm goto 由于某种原因不能有输出。我不想让它将所有寄存器刷新到内存,这会扼杀我这样做的全部意义,这是效率。但是,如果我使用空的 asm 语句,并且在它之前和之后将输出设置为“a”变量,那会起作用吗?它安全吗?这是我的宏:

并像这样使用它:

这有点难看,但效果很好。在我的测试场景中,它只编译 FINE 而没有易失性开销(将寄存器刷新到内存)而不会产生任何不好的东西,而且它似乎工作正常,但这只是一个有限的测试,我不可能在任何地方测试这个我使用这个函数/macro 正如我所说的,它被使用了很多,所以我想知道是否有人知识渊博,上述构造是否有不安全之处?

特别是,如果发生下溢,则不需要“a”的值,因此考虑到这一点,我的内联 asm 宏是否会发生任何副作用或不安全的事情?如果不是,我会毫无问题地使用它,直到他们优化编译器,所以我猜后可以将其替换回来。

请不要将其变成关于过早优化或其他问题的辩论,请继续关注问题的主题,我完全了解这一点,所以谢谢。

0 投票
2 回答
184 浏览

c++ - 了解有符号与无符号比较

有人可以告诉我为什么if条件为假吗?

我的意思是,这里 ua == int_max_value,它不是 -1,但是当我运行它时,输出是

已签署

0 投票
1 回答
183 浏览

assembly - 在组装中,我如何超越 -128 到 127 的范围?

所以我在 .bss 中有这个声明

作为答案,我存储从 -99 到 +99 的 2 位整数之和的结果。当我尝试添加 +99 和 +99 时,答案是否定的。-128 到 127 范围内的任何答案都被正确输入。如何解决此上溢/下溢问题?

我刚开始使用汇编编码,所以请帮助我理解这个问题。我尝试将 resb 设为 resw,但我的代码在运行时只产生了“浮点错误”,因此我恢复使用 resb。

我如何打印答案

0 投票
3 回答
19295 浏览

c - C:什么是缓冲区下溢的例子?

我知道缓冲区溢出是什么。但是我不知道缓冲区下溢是什么。

我猜这是当一个特定的缓冲区接收而不是字节溢出,字节下溢。

以上不会出错。

如果用户输入例如“deutschland”,则上述内容将导致缓冲区溢出。

我可以在代码中获得一个示例,缓冲区下溢是什么?

0 投票
1 回答
286 浏览

linear-algebra - 优雅的下溢

我一直在寻找这个问题,但我无法理解这个问题的含义。

问题:

我知道溢出条件是这样的:如果一个整数可以存储最大值 x并且如果我们分配一个值x+1,则值x+1将转换为整数可以容纳的最小值。我知道下溢正好相反。

从高性能科学计算/线性代数的角度来看,它如何?

我已阅读此链接,但我认为这与我上面提到的下溢/溢出内容相同。优雅的下溢代表什么?

0 投票
2 回答
607 浏览

floating-point - 如何为支持次正规数的实现(IEEE754)定义下溢?

最近我对IEEE754标准下溢的定义感到困惑。我们知道,如果一个实现不支持次正规数,那么可以表示的最小数是 MinNorm = 1.0 * 2^-126。对于任何操作,如果其结果小于 MinNorm,将被视为下溢。但是如果一个实现支持次正规数,那么可以表示的最小数是 MinSubnorm = 1.0 * 2^-149。现在的问题是:如果运算的结果小于 MinNorm,它是否是下溢?小于 MinSubnorm 怎么样?

现在我正在实现一个支持次正常数的 FPU。我们假设舍入前的结果严格在 -MinNorm 和 +MinNorm 之间,并且在舍入后也会小于 MinNorm(可以用次正规数表示)。我会认为它是什么?下溢还是非下溢?如果我需要设置下溢的状态位?

我在网上找到了一些信息,但意见分歧如下:

  1. http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/underflow.html 当您执行的操作小于最小非零数时,就会发生下溢。在 IEEE 754 单精度中,这意味着一个值(即绝对值)小于 1.0 x 2-149。

  2. http://en.wikipedia.org/wiki/Arithmetic_underflow 当浮点运算的真实结果在幅度上小于可表示为正常浮点数的最小值时(即接近零),可能会发生算术下溢。目标数据类型

0 投票
1 回答
50 浏览

math - google guava 库中溢出的条件

这是 LongMath.checkedAdd() 方法的代码,该方法在溢出或下溢时引发算术异常。

我理解为什么此 API 正在测试 (a ^ result) 但我不明白包含此条件的原因: (a ^ b) < 0 。测试这些数字是否具有相反的符号有什么帮助?

0 投票
1 回答
716 浏览

c++ - c++ 中的递增/递减字节(char),带有上溢/下溢

在考虑上溢和下溢的同时,在 C++ 中递增/递减字节的最佳方法是什么?例如,我有:

如果 c <= 0xF4,这将很好地工作,但任何高于此的值都会导致溢出。同样,如果它是 c -= 0xB; 并且 c < 0xB,将发生下溢。

假设c = 0xFF,相加后会是0xA吗?同样下溢,如果 c = 0,结果会是 0xF5 吗?

此外,由于一些奇怪的原因,当我增加特定数字时,会出现奇怪的结果。例如,如果我将 0x0 增加 0xA,则使用以下代码:

结果是:0x0D 0x0A 而不仅仅是 0x0A... 如下图所示: 增量问题

而所有其余的字节都正确增加。

0 投票
1 回答
529 浏览

binary - 二进制补码二进制加法

我有一个程序可以添加 2 个二进制补码并输出输出。它们是从文件中读取的,因为第一个二进制数是二进制补码。第二个二进制数是有偏差的表示法。为了改变偏向二进制补码的形式,我们翻转最左边的位。然后我们将两个二进制数相加并将输出提供给文件。我遇到的问题是理解输出。这是输出,其中第一个二进制数是二进制补码,第二个是有偏表示法。

鉴于第三个示例说 3 + 7 = 6。这是否正确?这似乎不对,但其他例子是正确的。比如-16 + 8 = -8。

所以我的问题是......这个文件的输出是否正确?