繁体   English   中英

从long double转换为long long int

[英]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 (与没有这种保证的unsignedint不同,它保证能够代表结果)。 然后,在进行乘法运算时,它将值提升为long double

如果您主要执行浮点运算,那么对于那些将维护此类代码的人来说,第一个更容易理解。 对于写数字代码但不熟悉位操作的人来说,第二个可能是相当神秘的-具有讽刺意味的是,您已经证明自己相信^是幂运算。

您需要测试以确定哪个选项提供更好的性能(鉴于在第二个中需要将unsigned long转换为long double ,并且需要在第一个中将std::pow()潜力针对某些特殊情况进行优化)。 换句话说,在这两种情况下,编译器优化程序都有可能变得更加激进,或者可能是精心设计的pow()实现,或者两者都有。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM