我有一个关于模数的问题。模运算求一个数除以另一个数的余数。我期待 0.5 % 0.1 = 0 的结果。但是当我在 PHP 或 .net 中运行它时,我得到 0.1。
我运行的 php 代码是:
var_dump(fmod(0.5, 0.1));
Run Code Online (Sandbox Code Playgroud)
在 .net 中,我尝试了以下结果:
Console.WriteLine(0.5%0.1);
Run Code Online (Sandbox Code Playgroud)
我还尝试了一个在线计算器http://www.calculatorpro.com/modulo-calculator/。
所有这 3 种方法都给了我 0.1 作为答案。
但是当我在谷歌中输入这个时,我得到了我期望的结果http://www.google.nl/search?source=ig&hl=nl&q=0.5%20mod%200.1&meta=。
这是 .net/php 中的错误还是 google 知道正确答案?谁能解释为什么会出现这些差异?
我正在做一本书的挑战,它要求我创建一个从 20 倒数到 0 的循环,并让我为每个数字打印一条消息。但是,它要求我为每个可被 5 整除的数字打印出一条特殊消息。我已经看到了某些示例,包括这个示例:
if (number%5==0)
{
//your code here
}
Run Code Online (Sandbox Code Playgroud)
我知道模在做什么,但为什么这段代码==0后面有?例如,为什么不像这样编码:
if (number%5)
{
//your code here
}
Run Code Online (Sandbox Code Playgroud) 在 MIPS 中,我对如何让 mod 工作感到困惑。下面是我到目前为止想出的代码。除了mod之外我可能还有更多错误,但我觉得这些错误是mod误解的结果。我要做的就是在此处获取工作代码(python):
i = 1
k = 0
while i < 9:
if i % 2 != 0:
k = k + i
i += 1
print(k)
Run Code Online (Sandbox Code Playgroud)
正确转换为 MIPS。这是我第一次尝试组装,所以在下面的代码中可能有比 mod 错误更多的错误:
# Takes the odd integers from 1 to 9, adds them,
# and spits out the result.
# main/driver starts here
.globl main
main:
#data segment
.data
Li: .byte 0x01 # i = 1
Lj: .byte 0x09 # j = 9
Lk: .byte 0x00 # k …Run Code Online (Sandbox Code Playgroud) 我正在为 ARM8 (aarch64) 编写一些汇编代码。我想做一个除法并使用获得的余数进行进一步计算。在 x86 中,当我使用 'div' 时,我知道我的剩余部分保存在RDX 中。我的问题是 - 是否有与 aarch64 指令集中的等价物?我知道 'udiv' 和 'sdiv' 做无符号和有符号的除法,并得到商数。是否有一条指令可以给我余数?(我想要 c 中的 % 模运算符)。我知道我可以使用代数获得它,只是想确认我没有错过更简单的方法。
我正在尝试计算(6.6 % 1.1)。我预计这是 0,但我得到 1.0999999999999996。您可以在 javascript 控制台中轻松地重现这一点。我猜这是一个内部舍入错误?你如何解决这个问题?
我尝试过这个 -
x=[2,3,4,7,9]
count=0
for i in x:
if i%2:
count=count+1
print count
Run Code Online (Sandbox Code Playgroud)
为什么计数3而不是2,因为i%2仅满足“2 和 4”?
我知道对于无符号整数,如果除数是 2 的幂,我可以用位掩码替换模运算。对于浮点数,是否有任何数字具有类似的属性?也就是说,是否有任何数字n可以f mod n比一般情况更有效地计算,而不必使用位掩码?
当然,除了一个。 脑部衰竭
编辑:澄清一下,f是任何浮点数(在运行时确定),
n是任何格式的任何编译时常量,我希望结果是浮点数。
如果我有一个长度为 L=77 的字符串,我想将其填充到 N=10 的倍数的长度。我感兴趣的是计算所需的填充量。这可以很容易地用 来完成N - (L % N),除了L % N为零的情况。
我现在一直在使用以下内容:
pad = (N - (L % N)) % N
Run Code Online (Sandbox Code Playgroud)
这看起来不是特别清晰,所以有时我使用
pad = N - (L % N)
if pad == N:
pad = 0
Run Code Online (Sandbox Code Playgroud)
使用三行代码来完成如此简单的事情似乎有些过分了。
或者,我可以找到kfor which k * N >= L,但使用math.ceil似乎也有点矫枉过正。
我缺少更好的选择吗?也许某个地方有一个简单的功能?
有人可以解释一下这是怎么回事吗?
-1 % 7 = 6 https://www.wolframalpha.com/input/?i=-1%257 ...但是
echo (-1 % 7)."\n"; // prints -1 WRONG
echo fmod(-1,7)."\n"; // prints -1 WRONG
Run Code Online (Sandbox Code Playgroud)
我还尝试了 php.net 中的这些示例,它们都正确返回。
echo (5 % 3)."\n"; // prints 2
echo (5 % -3)."\n"; // prints 2
echo (-5 % 3)."\n"; // prints -2
echo (-5 % -3)."\n"; // prints -2
Run Code Online (Sandbox Code Playgroud)
PHP 给了我一个我无法解释的结果 -1%7。它没有溢出 int 但我fmod还是尝试了,但我仍然遇到同样的问题(即看起来不是这个问题:php modulo 返回错误的结果)
我正在寻找一种非常有效的 CPU 方法来计算 C 中的浮点模数一(包括负值)。我使用它进行归一化相位缩减(包装,即 7.6 -> 0.6、0.2->0.2、-1.1 -> 0.9等等)。
据我了解,fmod() 和 Floor() 通常效率很低。我不需要严格的函数,即考虑 nan 或 inf,因为我负责传递有效值。
我一直在使用
m = x - (float)(int)x;
m += (float)(m<0.f);
// branchless form to add one if m is negative but not zero
Run Code Online (Sandbox Code Playgroud)
从基准来看,它通常比 fmod() 或使用 Floor() 代替 int 转换更有效,但我想知道是否存在更有效的方法,也许基于位操作......
我正在使用 gcc 在 64 位 intel cpu 上进行编码,但出于我的目的,我使用 32 位单精度浮点数。
如果其他地方已经解决了同样的问题,我深表歉意,但从我的搜索中我找不到任何关于这个特定主题的信息。
编辑:抱歉,我意识到最初发布的代码中有一个微妙的错误,所以我必须修复它。如果结果 (m) 为负数则必须加 1,如果 x 为负数则不必加 1
EDIT2:实际上,在 GCC 12 上使用 x-floor(x) 而不是 x-(float)(int)x 以及所有数学优化对相同函数进行基准测试后,我必须说前者更快,因为 GCC 显然足够聪明用非常高效的代码替换 Floor() 内联函数(至少在我的英特尔 i7 上是这样)。然而,对于每个 cpu 和编译器来说,情况可能并不总是如此,因为在其他情况下,根据个人经验,floor() …