我并不是真的想要优化任何东西,但我记得我一直都是从程序员那里听到的,我把它当作一个真理.毕竟他们应该知道这些东西.
但我想知道为什么除法实际上比乘法慢?分裂只是一个美化的减法,乘法是一个美化的加法吗?所以在数学上我不明白为什么一种方式或另一种方式在计算上有非常不同的成本.
任何人都可以澄清这个的原因/原因所以我知道,而不是我从其他程序员那里听到的,我之前询问的是:"因为".
int x = n / 3; // <-- make this faster
// for instance
int a = n * 3; // <-- normal integer multiplication
int b = (n << 1) + n; // <-- potentially faster multiplication
Run Code Online (Sandbox Code Playgroud) 我认为java.math.BigDecimal应该是The Answer™需要用十进制数执行无限精度算术.
请考虑以下代码段:
import java.math.BigDecimal;
//...
final BigDecimal one = BigDecimal.ONE;
final BigDecimal three = BigDecimal.valueOf(3);
final BigDecimal third = one.divide(three);
assert third.multiply(three).equals(one); // this should pass, right?
Run Code Online (Sandbox Code Playgroud)
我希望assert通过,但事实上执行甚至没有到达那里:one.divide(three)原因ArithmeticException被抛出!
Exception in thread "main" java.lang.ArithmeticException:
Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide
Run Code Online (Sandbox Code Playgroud)
事实证明,API中明确记录了此行为:
在这种情况下
divide,准确的商可能有一个无限长的十进制扩展; 例如,1除以3.如果商具有非终止十进制扩展并且指定操作以返回精确结果,ArithmeticException则抛出a.否则,返回除法的确切结果,与其他操作一样.
进一步浏览API,人们发现实际上有各种重载divide执行不精确的划分,即:
final BigDecimal third = one.divide(three, 33, RoundingMode.DOWN);
System.out.println(three.multiply(third));
// prints "0.999999999999999999999999999999999"
Run Code Online (Sandbox Code Playgroud)
当然,现在显而易见的问题是"有什么意义?".BigDecimal当我们需要 …
我正在研究其他的东西,但一切都是零,所以我做了这个简约的例子,输出仍然是0.
#include <iostream>
int main(int argc, char** argv)
{
double f=3/5;
std::cout << f;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
当我在C#中进行分割时,它会自动向下舍入.看这个例子:
double i;
i = 200 / 3;
Messagebox.Show(i.ToString());
Run Code Online (Sandbox Code Playgroud)
这显示了一个包含"66"的消息框.然而,200/3实际上是66.66666.
有没有办法可以避免这种四舍五入并保持像66.6666667这样的数字?
对于大商,整数除(//)似乎不一定等于常规除(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中进行这种划分而没有精度错误?
任何帮助将不胜感激.
很多年前,在大学里,我学会了正确地按位移动实现与除以2相同的操作,但通常要快得多.自从9-10年前我了解到这一点以来,我不确定Java在这方面是如何出现的.Java编译器是否自动将二分频转换为位移操作,还是应该自己在代码中手动执行位移操作?
我想在PHP中找到所有多个数字.
我正在使用这样的东西
if($count != 20 )
Run Code Online (Sandbox Code Playgroud)
计算如果$count不等于20.
但我也需要这个脚本来检查是否$count不等于20,40,60,80,100,120,140,160等.
有任何想法吗?我想我需要使用模数符号(%),但我不知道.
division ×10
java ×3
performance ×2
python ×2
bigdecimal ×1
bit-shift ×1
c# ×1
c++ ×1
financial ×1
integer ×1
modulus ×1
optimization ×1
php ×1
precision ×1
zero ×1