标签: integer-division

为什么将float除以整数返回0.0?

因此,如果我有一个数字范围'0 - 1024'并且我想将它们带入'0 - 255',则数学将要求将输入除以输入的最大值(在这种情况下为1024),这将给出我是一个介于0.0 - 1.0之间的数字.然后乘以目标范围,(255).

这就是我想要做的!

但由于某种原因,在Java中(使用Processing)它总是返回值0.

代码就像这样简单

float scale;
scale = (n/1024) * 255;
Run Code Online (Sandbox Code Playgroud)

但我得到0.0.我试过double和int.一切都无济于事.为什么!?

java math division integer-division

40
推荐指数
3
解决办法
5万
查看次数

检查一个数字是否可以被3整除

我需要找出一个数字是否可以被3整除而不使用%,/或者*.给出的提示是使用atoi()函数.知道怎么做吗?

division modulo integer-division

37
推荐指数
8
解决办法
2万
查看次数

汇编语言 - 如何模数?

在x86汇编程序中有类似模运算符的东西吗?

x86 assembly modulo integer-division

34
推荐指数
2
解决办法
10万
查看次数

为什么在 x86 上除以 3 需要右移(和其他奇怪的东西)?

我有以下 C/C++ 函数:

unsigned div3(unsigned x) {
    return x / 3;
}
Run Code Online (Sandbox Code Playgroud)

使用 clang 10 at编译-O3,结果为:

div3(unsigned int):
        mov     ecx, edi         # tmp = x
        mov     eax, 2863311531  # result = 3^-1
        imul    rax, rcx         # result *= tmp
        shr     rax, 33          # result >>= 33
        ret
Run Code Online (Sandbox Code Playgroud)

我所理解的是:除以 3 相当于乘以乘法逆 3 -1 mod 2 32,即 2863311531。

不过还是有些不明白的地方:

  1. 为什么我们需要使用ecx/rcx呢?我们不能乘raxedi直接?
  2. 为什么我们在 64 位模式下乘法?乘以eaxand不是更快ecx吗?
  3. 为什么我们使用imul …

c++ assembly compilation x86-64 integer-division

32
推荐指数
4
解决办法
1703
查看次数

整数除法总是等于常规除法的底限吗?

对于大商,整数除(//)似乎不一定等于常规除(math.floor(a/b))的最低值.

根据Python文档(https://docs.python.org/3/reference/expressions.html - 6.7),

整数的平面划分产生整数; 结果是数学除法的结果,"floor"函数应用于结果.

然而,

math.floor(648705536316023400 / 7) = 92672219473717632

648705536316023400 // 7 = 92672219473717628
Run Code Online (Sandbox Code Playgroud)

'{0:.10f}'.format(648705536316023400 / 7) 收益率'92672219473717632.0000000000',但小数部分的最后两位数应为28而不是32.

python integer division floating-accuracy integer-division

30
推荐指数
3
解决办法
1143
查看次数

为什么整数除法代码给出了错误的答案?

我在Java中有一个非常简单的划分(它是每小时的产品数量/产量),但每当我进行这个划分时,我都会遇到奇怪的错误:

float res = quantity / standard;
Run Code Online (Sandbox Code Playgroud)

我已经尝试了上面的几个值的分区,但我总是得到错误,但是我在其他地方尝试并且正确的那个是这样的:

世界各地:

13.6 = 6800 / 500;
Run Code Online (Sandbox Code Playgroud)

Java的:

13.0 = 6800 / 500;
Run Code Online (Sandbox Code Playgroud)

我已经研究过BigDecimal和BigInteger,但是我还没有找到用它们创建这个除法的方法,有没有其他方法在Java中进行这种划分而没有精度错误?

任何帮助将不胜感激.

java floating-point division integer-division

29
推荐指数
1
解决办法
6万
查看次数

如何获得整数除法中的分数?

你如何划分两个整数并在C中获得双重或浮动答案?

c integer-division

24
推荐指数
1
解决办法
8万
查看次数

为什么我不能通过使用Int获得百分比

请原谅我的编程知识.我知道这是一件简单的事情,但我不明白为什么结果总是为什么.为什么十进制会很好?

int a = 100;
int b = 200;
decimal c = (a / b) * 100;
Run Code Online (Sandbox Code Playgroud)

非常感谢.

c# integer-division

23
推荐指数
3
解决办法
2万
查看次数

舍入整数除法

是否有一种简单的pythonic方法可以在不使用浮点的情况下舍入到最接近的整数?我想做以下但使用整数运算:

skip = int(round(1.0 * total / surplus))
Run Code Online (Sandbox Code Playgroud)

==============

@John:浮点数不能跨平台重现.如果您希望您的代码在不同平台上传递测试,那么您需要避免浮点(或者在测试中添加一些hacky espilon内容并希望它能够正常工作).以上可能很简单,在大多数/所有平台上都是相同的,但我宁愿不做出这个决定,因为更容易完全避免浮点.那"不符合Python的精神"怎么样?

python rounding integer-division

23
推荐指数
3
解决办法
3万
查看次数

整数除法算法

我正在考虑一个大数除法的算法:用bigint D除以余数bigint C,我们知道基数b中C的表示,D是b ^ k-1的形式.在一个例子中展示它可能是最容易的.让我们尝试将C = 21979182173除以D = 999.

  • 我们将数字写成三位数的集合:21 979 182 173
  • 我们从左边开始采用连续集合的总和(模999):21 001 183 356
  • 我们在"超过999"之前的那些集合中加1:22 001 183 356

实际上,21979182173/999 = 22001183,其余为356.

我已经计算了复杂度,如果我没弄错的话,算法应该在O(n)中工作,n是基本b表示中C的位数.我在C++中也做了一个非常粗略和未经优化的算法版本(仅适用于b = 10),根据GMP的一般整数除法算法进行测试,它确实看起来比GMP更好.在我看的任何地方都找不到这样的东西,所以我不得不求助于对抗一般师.

我发现有几篇文章讨论了看起来非常相似的问题,但没有一篇专注于实际的实现,特别是在不同于2的基础上.我想这是因为数字在内部存储的方式,尽管所提到的算法似乎很有用,比方说,b = 10,即使考虑到这一点.我也尝试过联系其他人,但是,再一次无济于事.

因此,我的问题是:是否有文章或书籍或其他描述上述算法的东西,可能会讨论实施?如果没有,那么尝试在C/C++中尝试实现和测试这样的算法是否有意义,或者这种算法本质上是不是很糟糕?

另外,我不是程序员,虽然我在编程方面还算合理,但我还是对计算机"内部"知之甚少.因此,请原谅我的无知 - 这篇文章很可能有一个或多个非常愚蠢的事情.再次抱歉.

非常感谢!


进一步澄清评论/答案中提出的观点:

谢谢,每个人 - 因为我不想用同样的事情评论所有伟大的答案和建议,我只想谈谈你提到的很多观点.

我完全清楚,一般来说,在基地2 ^ n工作显然是最有效的做事方式.几乎所有bigint库都使用2 ^ 32或其他.但是,如果(并且,我强调,它仅对这个特定算法有用!)我们将bigint实现为基数b中的数​​字数组?当然,我们要求b在这里"合理":b = 10,最自然的情况,似乎足够合理.我知道考虑到内存和时间,考虑到内部存储数字的方式或多或少效率不高,但我能够,如果我的(基本的和可能有些缺陷的)测试是正确的,产生的结果比GMP的一般部门更快,这对于实现这样的算法是有意义的.

Ninefingers通知我必须在这种情况下使用昂贵的模运算.我希望不是:我只能通过查看old + new + 1的位数来看看是否旧的+新交叉,比如说999.如果它有4位数字,我们就完成了.更重要的是,由于旧<999和新<= 999,我们知道如果旧+新+ 1有4位数(它不能有更多),那么,(旧+新)%999等于删除最左边的数字(老+新+ 1),我认为我们可以廉价地做.

当然,我并没有质疑这个算法的明显局限性,也没有声称它无法改进 - 它只能分成一定数量的数字,我们必须事先了解基数b中股息的表示.然而,例如,对于b = 10,后者看起来很自然.

现在,我们已经实施了如上所述的bignums.假设基数b中的C =(a_1a_2 ... a_n)且D = b ^ k-1.算法(可能更加优化)会像这样.我希望没有很多错别字.

  • 如果k> n,我们显然已经完成了
  • 在C的开头添加一个零(即a_0 = 0)(以防万一我们试图除以9999和99)
  • l = n%k ("常规"整数的mod - 不应该太贵)
  • old …

c++ algorithm performance integer-division bigint

23
推荐指数
2
解决办法
6874
查看次数