[英]conversion from long double to long long int
我有一个很长的双正弦和一个很长的int放大器。 我正在使用<cmath>
并具有以下代码:
sine = sin(point);
amp = round(sine * 2^31);
此处,可变点以0.009375的间隔递增。 第一行在这里工作正常,但在第二行中,我收到此错误消息:
error: invalid operands of types 'long double' and 'int' to binary 'operator^'
我不确定该错误的含义,这里的主要要求是“如何解决这个问题,以便将输出整数输入到可变放大器中?”
在C ++中, ^
运算符表示互斥或非幂。 您可能的意思是( 1ULL << 31
)。
错误的原因是*
是乘法,而^
是按位xor
运算符,只能应用于整数类型。
乘法( *
)的优先级高于^
。 因此,编译器会解释amp = round(sine * 2^31);
如amp = round( (sine *2)^31);
。 sine
(大概)具有long double
类型,因此sine*2
的结果也为long double
类型。 long double
不是整数类型,因此不能是^
的操作数。 因此,错误。
您的错误是假设^
代表幂,但事实并非如此。
您可以通过以下任一方法解决问题
amp = round (sine * pow(2.0, 31)); // all floating point
要么
amp = round (sine * (1UL << 31));
第二种方法将1
左移的31位计算为unsigned long
int
(与没有这种保证的unsigned
或int
不同,它保证能够代表结果)。 然后,在进行乘法运算时,它将值提升为long double
。
如果您主要执行浮点运算,那么对于那些将维护此类代码的人来说,第一个更容易理解。 对于写数字代码但不熟悉位操作的人来说,第二个可能是相当神秘的-具有讽刺意味的是,您已经证明自己相信^
是幂运算。
您需要测试以确定哪个选项提供更好的性能(鉴于在第二个中需要将unsigned long
转换为long double
,并且需要在第一个中将std::pow()
潜力针对某些特殊情况进行优化)。 换句话说,在这两种情况下,编译器优化程序都有可能变得更加激进,或者可能是精心设计的pow()
实现,或者两者都有。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.