2011-05-30 129 views
0

这是我用2 * M_PI检查数字的可分性所做的工作。 “w”是2/3的常数,t是变量t + = dt的变量,其中dt为0.1。我试图使用mod运算符%来查看是否有可分割的东西。但它不工作。如何检查一个数字是否可以被2 * M_PI整除在C++中?

bool divisible; real w = 2/3; real t;

if((w*t) % 2*M_PI == 0) 
    { 
     divisible = true; 
    } 

else 
    { 
     divisible = false; 
    } 

这是我得到的,“类型‘真实’和‘INT’的无效操作数为二进制‘操作符%’”

这是什么意思的错误?我如何得到这个工作?那么我需要让w和t成为int吗?它们不能是因为w是2/3,并且t从0增加0.1。有人可以帮帮我吗?

+0

只要检查'cos(w * t)== 0';) – MSalters 2012-12-10 11:00:19

回答

3

改为使用std::fmod,它运行在双打而不是整数%运营商。

+2

并注意舍入误差,即不要使用'=='进行比较,而是看看您是否在所需值的可接受的ε内。 – Waldheinz 2011-05-30 10:09:14

+0

我正在编译错误,w是双精度型,t是双精度型,而M_PI是我认为的浮点数?应该,fmod((w * t)/(2 * M_PI))是否工作? – QEntanglement 2011-05-30 10:21:39

+0

@QEntanglement,你看过这个函数的签名吗?我故意留下了一个链接(即为你做一个侧面思考!)) – Nim 2011-05-30 10:23:32

2

“%”是整数模运算符不工作的浮动/ double参数/操作数

有存在于文件math.h浮法/双MODF功能这可能有助于

  • 一个示例可以是在例如
+0

'modf'不是一个模运算,它只是把double分解为整数和小数部分。 – Nim 2011-05-30 10:11:50

+0

要使用modf,必须先执行另一个步骤: – Uhli 2011-05-30 12:08:51

+0

函数modf调用中使用的第一个参数的计算步骤:double arg1 =(w * t)/ 2 * M_PI。如果结果(小数部分)等于或接近0.0,则可变整除(在问题的示例中)必须设置为true。别忘了 - 结果受有限浮点精度的影响,可能会断言M_PI不等于0! – Uhli 2011-05-30 12:21:45

2

为什么你想知道如果一个浮点数是正是被另一个整除?

浮点运算不应用于“精确”计算。每个操作的结果都是严格定义的,但它不同于同一操作的数学意义。 特别是:

double a = 1e20; 
double b = 1e-20; 

double c = (a + b) - a; 

你可能会以为c将等于b,但实际上它不会!

您应该只将浮点数与某个窗口进行比较。意思是 - 特定的浮点值是否在某个有限长度范围内。

相关问题