使用带浮点数的模运算符

Posted

技术标签:

【中文标题】使用带浮点数的模运算符【英文标题】:Using modulus operator with floats 【发布时间】:2014-06-08 12:39:53 【问题描述】:

有人在编程比赛中问过这个问题:-

-1%1000000009 是 -1 或 1000000008

我想知道,这可能吗? 我在我的系统中尝试过,每次都得到-1。 另外,我必须找出 10^-9 % 10^9,我使用 fmod 并得到答案 1e-009,不应该是 1 吗?

我的解释:- 10^-9/10^9 = 1/10^18 所以,答案 = 1。

请告诉我哪里错了。

【问题讨论】:

@Jongware 我正在编写一个程序,所以我需要清楚地了解程序内部发生的情况。这没有帮助。还有其他帮助吗? % 不是浮点运算符 请改进您的标题,以便问题突出 您需要区分模运算和余数运算。在 C、Java 和大多数其他语言中,它是余数并产生 -1,而 python 和某些环境具有真正的模数运算并返回 1000000008 @Jongware:嗯?不,你不会期望零。那没有任何意义。 【参考方案1】:

预览:(我将mod称为%

就像在 1%3 中一样,我们做 (int) 1/3 也就是 0 ,然后我们问:要添加多少才能得到 1

答案是 1。

所以1%3=1


看着10^-9 % 10^9

为了清楚起见,让我们使用另一个数字:

2^-3 % 2^3

首先我们计算偏差的整数值:

2^-3 / 2^3 = 1/(2^3 * 2^3) = 1/64

如你所见,这是一个很小的数字

所以int部分是0。

所以 - 要添加多少才能获得 2^-3 ?没错:2^-3


关于您的确切问题:

我的解释:- 10^-9/10^9 = 1/10^18 所以,答案 = 1。

1/10^18 确实如此。

整数部分是什么?

从零开始,我们需要添加多少才能达到-1

是的,-1.

只要遵循模数的规则。

首先找到整数偏差。然后问:我们需要加多少才能得到分子。

编辑:

对于分子>分母的情况

7 % 5 = > 7 /5 => 1.4 => .4 go to hell = > you're left with 1.

但请注意。

这是 1 乘以 5。

好吧,从 1 乘以 5 - 到 7 需要多少?是的:2。

更高级:

3.111 %2 = > 3.111/2 = > 1.5555 => .555 go to hell => you're left with 1.

但那是 2 的 1 倍。

所以从 1 乘以 2 - 到 3.111 需要多少?是的 1.111

【讨论】:

这是否意味着在每种情况下,分子是浮点数而分母是整数类型并且比浮点数大得多,答案只会是浮点数(最初是分子)? @user3715736 即使分子有橙子浮点数,分母有整数苹果:你首先(!)取结果的整数部分(!)所以2.111 % 3 => 2.111/3 =>0.7033 => .7033 go to hell => you're left with 0 => so how much we need to get to 2.111 ? 2.111 % 不适用于浮点类型。你不能写3.111 % 2 @LưuVĩnhPhúc 我的整个答案都是从数学角度。我将% 称为Modulo。(我使用c#,它是有效的声明)。 在这种情况下使用 mod 这样的符号更好

以上是关于使用带浮点数的模运算符的主要内容,如果未能解决你的问题,请参考以下文章

Java之浮点数运算

浮点数运算——加减乘除都有哈

4-浮点数运算

Python 模拟32bit 浮点数运算

Python中的模运算符

浮点数剖析