问题标签 [iec10967]

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 投票
63 回答
588639 浏览

algorithm - 如何计算 32 位整数中设置的位数?

代表数字 7 的 8 位如下所示:

设置了三位。

确定 32 位整数中设置位数的算法是什么?

0 投票
11 回答
61579 浏览

floating-point - 对于 IEEE754 NaN 值返回 false 的所有比较的基本原理是什么?

为什么 NaN 值的比较与所有其他值的行为不同?也就是说,与运算符 ==、<=、>=、<、>(其中一个或两个值为 NaN)的所有比较都返回 false,这与所有其他值的行为相反。

我想这在某种程度上简化了数值计算,但我找不到明确说明的原因,甚至在Kahan的关于 IEEE 754 状态的讲义中也没有,它详细讨论了其他设计决策。

在进行简单的数据处理时,这种异常行为会造成麻烦。例如,在 C 程序中对某个实值字段的记录列表进行排序时,我需要编写额外的代码来处理 NaN 作为最大元素,否则排序算法可能会变得混乱。

编辑: 到目前为止的答案都认为比较 NaN 是没有意义的。

我同意,但这并不意味着正确答案是错误的,而是不是布尔值 (NaB),幸运的是它不存在。

因此,在我看来,比较返回真或假的选择是任意的,对于一般数据处理,如果它遵守通常的规律(== 的自反性,<,==,> 的三分法),以免数据结构依靠这些法律变得混乱。

所以我要求打破这些法律的一些具体优势,而不仅仅是哲学推理。

编辑 2: 我想我现在明白为什么将 NaN 设为最大值是一个坏主意,它会弄乱上限的计算。

NaN != NaN 可能是可取的,以避免检测循环中的收敛,例如

但是,最好通过将绝对差异与小限制进行比较来编写。所以恕我直言,这是在 NaN 打破反身性的一个相对较弱的论据。

0 投票
2 回答
650 浏览

c# - 如何使整数“更大”?

我是 C# 初学者,我正在使用 Windows 窗体中的计算器。

我遇到了一个问题,在界面中输入了 10 个或更多数字后,我得到了其中一个调试信息。它说的是系统溢出异常,但我不太明白。

有人可以告诉我一种制作Int64变量的简单方法吗?

0 投票
3 回答
527 浏览

php - 长整数在插入较短的列时进行转换,而不是截断。为什么?公式是什么?

我有一列integer长度为 10 的类型:

在此列中,我插入了一个太长的数字:

当我查看表格中的内容时,现在的数字是:

2147483647

如何以及为什么715988985123857变成2147483647?
为什么没有被截断?
这种转换背后的机制是什么,可以用一些公式计算得到的数字吗?


我不是在寻找解决方案。我只是想了解具体的数字。

0 投票
1 回答
711 浏览

c - GMP 库的整数乘法限制

我试图使用GMP 库中的函数将两个非常大mpz_t的 s 相乘,每个 s 。2^(10*2^22) bitsmpz_mul

没有分段错误,并且乘法成功通过。但是,当我将乘法结果输出到文件时,我观察到的只是一串尾随零。

有什么办法可以克服这个限制吗?

0 投票
1 回答
753 浏览

floating-point - 为什么 IEEE-754 决定 NaN != NaN 尽管不合逻辑?

这是对 IEEE754 NaN 值的所有比较返回 false 的基本原理是什么的后续问题(我认为这是另一个问题,而不是评论)。它有一个很好的答案,但缺少了一件重要的事情:为什么NaN != NaN

我知道 NaN 与数字相比是无序的,因此NaN < x两者NaN > x总是错误的。但这并不能解释为什么平等是倒退的。引用我链接到的问题的答案:

有必要为程序员提供一种方便有效的检测 NaN 值的方法,这种方法不依赖于提供类似的编程语言isNan()

那好吧:

这是方便、高效的,并且不依赖于编程语言提供的结构。即使编程语言没有定义全局 NaN,您也可以轻松地自己创建一个局部(或全局)变量。

一个额外的操作当然不是低效的,特别是因为 FPU 有一个硬编码的响应(不需要计算)。使用 0/0 也比不合逻辑的x!=x.

程序很少需要检查 NaN 并且每次检查都有一个额外的操作不会成为程序效率低下的原因。同样,没有任何程序受到如此限制,以至于它不能处理一个额外的变量,尤其是一个临时变量。

对我来说,“我需要这样我才能检测到它”的论点没有意义:它与“我需要这样我可以检测到它”NaN!=NaN的论点完全相同。Infinity!=Infinity不,您没有,只需像其他人一样将其与 1/0 进行比较。

所以我的问题比原来的问题要窄得多:为什么是NaN != NaN

我不知道以前是否有人问过这个问题,因为原始问题有很多重复项。

边注:

NaN == NaN现在不会改变

虽然 FPU 现在不会改变,但一些编程语言已经改变,所以这NaN == NaN是真的。

编辑:

让我试着澄清一下为什么到目前为止我还没有接受任何答案。到目前为止,我已经阅读了评论,很抱歉我丢了球:我没有解释为什么我不同意,而是问“为什么”,希望你能给出不同的理由。所以让我试着更好地解释我的观点。

Infinity 和 NaN 在很多方面都很相似。

  1. Infinity 和 NaN 都是概念。无限不是一个数字,它是一个永无止境的概念。如果 x 是 Infinity,则它表示 x 是无限的。NaN 不是数字(duh),表示无效状态或数学上无效的东西。为了数学的完整性:无穷大是一个“数字”,但是浮点数近似于实数(尽管它们更接近于有理数),无穷大绝对不是实数。因此,就 FPU 和实数线而言,无穷大(所有类型)不是数字(根据域对“数字”的定义)。
  2. 相等并不总是数字相等。如果两个操作数都是数字(不是概念),即使要求 FPU 执行比较,一般相等仅是数字相等。当一个操作数是 Infinity 或 NaN 时,使用一般相等来查看另一个是否代表相同的概念。例如x == Infinity,不使用数字相等(因为 Infinity 不是数字)而是检查 x 是否代表正无穷大的概念。如果 x 是“不是数字”的概念,我同样希望x == NaN返回 true 的结果完全相同,但事实并非如此(至于为什么这个问题的重点)。
  3. 两者都可以通过除以 0 来检索:0/0 返回 NaN,1/0 返回 Infinity。如果您的语言没有 Infinity 的常数,那么x == (1/0)就是将 x 与 Infinity 进行比较的方法。
  4. 多种口味。Infinity 有无数种类型(因为基数)。然而,FPU 没有任何区别:Infinity 是通用的,也是唯一可用的。例如,使用这些构造,不可能询问 x 是否是可数无穷大。NaN 在概念上只有一种类型(“不是数字”),但它有两种处理方式:安静和信号。我对信号一无所知,但是根据我的理解,如果您尝试比较它会抛出的信号 NaN 的相等性,因此由于它不具有相等性,因此它并不完全是主题。
  5. 位表示。NaN 有许多不同的位表示,但 Infinity 只有 1(和 1 表示 -Infinity)。然而,NaN 的所有表示在逻辑上都是完全相同的值,因为它们都表示“非数字”的相同概念。0x7FF8000000000000 和 0x7FF8000000000001 之间没有区别:它们的含义完全相同,并且允许返回完全相同的数学结果。你不能问 x 是 sqrt(-1) 还是 x 是 log(-1),因为这两者都会返回完全相同的东西:NaN。类似于只有一种 Infinity,只有一种(安静的)NaN。是的,有多个位表示,但一个不大于其他:FPU 使用特殊逻辑将它们完全一样地对待。这同样适用于 -0,它的位与 +0 不同,但处理方式完全相同。因此,这些位是与逻辑相等无关的实现细节。
  6. (题外话,但他们也都有特殊的数学:x-1不会改变 Infinity 或 NaN 的值)。

所以是的,当你说“平等没有意义,因为它不是数字”时,我确实听到了你的声音,但我不同意这种说法,因为如果它是真的,那么按照#1,比较 Infinity 也是没有意义的(这也不是一个数字)。尽管根据#2,比较非数字确实有意义。

事实上,我已经阅读了原始问题的所有答案(以及为什么浮点无穷大,与 NaN 不同,相等?其中有一些相关的答案)。为什么是真的所有论点NaN != NaN都归结为“因为它不是一个数字”(已经解决)或“因为有许多不同的位表示”,这被#5反驳了。

我想不出任何逻辑基础来解释为什么 NaN 应该有不同的平等。我并不是说我已经解释了一切:那么我错过了什么?我的一个论点是错误的还是我没有想到的其他原因?这就是为什么我一直在使用“为什么”这个词。如果您不同意,请反驳我或捍卫您的观点。我猜我的上述逻辑至少会有 1 个反驳点,我期待听到它。

我再次为在原始问题中不包括这些内容而道歉,因为我一直在考虑它们。我也很抱歉,这可能会导致现有答案发生重大变化。

0 投票
3 回答
346 浏览

binary - 找到 0 的数量等于 1 的数量的第一个位置的位技巧

假设我有一个 32 位或 64 位无符号整数。

找到最左边位的索引 i 以使最左边 i 位中 0 的数量等于最左边 i 位中 1 的数量的最快方法是什么?我在想一些小技巧,就像这里提到的那样。

我对最近的 x86_64 处理器感兴趣。这可能与某些处理器支持指令有关,例如 POPCNT(计算 1 的数量)或 LZCNT(计算前导 0 的数量)。

如果有帮助,可以假设第一位始终具有某个值。

示例(16 位):如果整数是

那么 i=10 对应标记的位置。

16 位整数的可能(慢)实现可能是:

编辑:根据@njuffa 评论修复了代码中的错误。