代码之家  ›  专栏  ›  技术社区  ›  geometrian

构造“long double”r值[重复]

  •  1
  • geometrian  · 技术社区  · 6 年前

    #include <cmath>
    long double fn_d() {
        return pow( double(4), double(3) );
    }
    long double fn_ld() {
        return powl( long double(4), long double(3) );
    }
    

    MSVC对此很满意,但是GCC和Clang在第二个函数(GCC的输出)上混淆了:

    <source>:6:34: error: expected primary-expression before 'long'
    6 |     return powl( long double(4), long double(3) );
      |                                  ^~~~
    

    注意 fn_d(...) 上面,工作正常。 假设这不是两个编译器中的bug,我该怎么办呢?


    (long double)(4) (即演员)不好。它绊倒了 -Wold-style-cast (您应该使用)。也许 吧 static_cast<long double>(4) ? 这感觉很肮脏:我在构造一个对象,而不是在投射一个对象 int ,即使编译器会删除它。

    2 回复  |  直到 6 年前
        1
  •  0
  •   M.M    6 年前

    首先,原来的代码是不正确的,默默地接受它是MSVC的错误, see this question 标准参考。


    powl 是签名的非重载函数:

    long double powl(long double x, long double y);
    

    你可以直接写 powl(4, 3)

    在更一般的情况下,您的选择包括 (long double)4 , static_cast<long double>(4) , 4.L 4.0L . 这个 L 后缀加上 . long double 字面意义的。


    这感觉很肮脏:我在构造一个对象,而不是强制转换int,即使编译器会省略它。

    也许你在这方面有误解。代码 double(4) 是一个演员;它的正式名称是 . 强制转换是pr值,除了一些与此无关的情况。

    double 和价值 4 .

    对于类类型也是如此; (std::string)x std::string(x) ,和 static_cast<std::string>(x)

        2
  •  1
  •   NathanOliver    6 年前

    当你这样做时,C++语法不允许你在类型名称中有一个空格。 type(value)

    相反,你可以使用适当的后缀,而不是试图使用 . 为了一个 long double 你可以用 l L

    return pow( 4.0L, 3.0L );