因此,如果我有一个数字范围'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.一切都无济于事.为什么!?
我需要找出一个数字是否可以被3整除而不使用%,/或者*.给出的提示是使用atoi()函数.知道怎么做吗?
我有以下 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。
不过还是有些不明白的地方:
ecx/rcx呢?我们不能乘rax用edi直接?eaxand不是更快ecx吗?imul …对于大商,整数除(//)似乎不一定等于常规除(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.
我在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中进行这种划分而没有精度错误?
任何帮助将不胜感激.
请原谅我的编程知识.我知道这是一件简单的事情,但我不明白为什么结果总是为什么.为什么十进制会很好?
int a = 100;
int b = 200;
decimal c = (a / b) * 100;
Run Code Online (Sandbox Code Playgroud)
非常感谢.
是否有一种简单的pythonic方法可以在不使用浮点的情况下舍入到最接近的整数?我想做以下但使用整数运算:
skip = int(round(1.0 * total / surplus))
Run Code Online (Sandbox Code Playgroud)
==============
@John:浮点数不能跨平台重现.如果您希望您的代码在不同平台上传递测试,那么您需要避免浮点(或者在测试中添加一些hacky espilon内容并希望它能够正常工作).以上可能很简单,在大多数/所有平台上都是相同的,但我宁愿不做出这个决定,因为更容易完全避免浮点.那"不符合Python的精神"怎么样?
我正在考虑一个大数除法的算法:用bigint D除以余数bigint C,我们知道基数b中C的表示,D是b ^ k-1的形式.在一个例子中展示它可能是最容易的.让我们尝试将C = 21979182173除以D = 999.
实际上,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.算法(可能更加优化)会像这样.我希望没有很多错别字.