我试图在c ++中实现一个简单的抽取算法。我有两个数组,比如p
& q
,其中下标通过以下关系相互关联:
p[k] = q[0.5*k]
。这意味着以下序列应保持有效:
p[0] = q[0]
p[1] = 0
p[2] = q[1]
p[3] = 0
p[4] = q[2]
依旧......
请注意,p[k]
仅取值,且仅当(0.5*k)
的结果不包含小数位(或十进制为0)且不使用任何四舍五入等时
我的问题是:有没有办法区分一个整数(一个没有小数位的数字或只有十进制的0,比如说2.0)和一个带有小数位的数字,只要两者都有被抛到一倍?
例如。) 2.0是一个加倍的整数。 2.1是带小数位的数字。
例如。 2)* 0.9 * 2应该将0放入数组p而0.9 * 10应该将q [9]放入数组p。*
如果我使用语句(int) (0.5*k)
,那么无论k的值如何,我都会在每种情况下都得到一个整数。
修改:上述情况中的0.5只是说明性的。它可以是任何数字,例如2,2.5,0.9,0.95等。)
非常欢迎任何帮助,
谢谢,
斯利拉姆。
答案 0 :(得分:3)
假设k
是整数类型,您可以使用if (k % 2 == 0) ...
检查k
是否可以被2整除:
if (k % 2 == 0)
p[k] = q[k / 2];
else
p[k] = 0;
这也可以使用三元运算符表示:
p[k] = (k % 2 == 0) ? q[k / 2] : 0;
答案 1 :(得分:2)
假设coef可以是其他任何东西,
p[floor(coef*k)] = (fabs(coef*k-floor(coef*k))<1E-6)?q[k]:0;
答案 2 :(得分:1)
您想要做的简短语法可能是:
p[k] = k % 2 ? 0 : q[k/2];
有没有办法区分C ++中的整数和整数?
定义整数,并在此上下文中定义整数。我很困惑!
您是否正如here?
所解释的那样如果你想检测一个数字是否是整数,那么这可能会有所帮助:
#include<cmath>
bool IsInteger(double d)
{
double intpart;
return std::modf(double number, &intpart) == 0.0;
}
答案 3 :(得分:1)
k%2在这个帖子中有几个答案。
但是,这对回答OP的问题没有用。注意编辑: “编辑:上述案例中的0.5只是说明性的。它可以是任何数字,例如2,2.5,0.9,0.95等。”
k%2仅有效,因为所选值为0.5。任何其他价值观都不适用。
因此,除非我完全遗漏了一些东西,否则我能想到的最简单的方法如下:
从数字本身中减去数字的下限。如果结果是> 0,它不是整数。
答案 4 :(得分:0)
除非您的表达式导致数字不合理,否则您可以使用Boost.Rational来表示您的行为。
答案 5 :(得分:0)
@ Aix对k%2
的建议看起来好像与?:
运算符完美结合:
p[k] = (k%2) ? 0 : q[k/2];