gpt4 book ai didi

c++ - MSVC 用 double 支撑初始化似乎违反了标准?

转载 作者:可可西里 更新时间:2023-11-01 16:18:51 26 4
gpt4 key购买 nike

看看这个简单的程序:

int main() {
float f2 = 7.2; // OK, with warning
float f3 = 7.199999809265137; // OK, no warning
float f4{ 7.2 }; // Fails
float f5{ 7.199999809265137 }; // OK, no warning
float f6 = { 7.2 }; // Fails
float f7 = { 7.199999809265137 }; // OK, no warning
}

当使用默认选项(cl/W4,版本 19.00.23918)使用 MSVC 2015 编译时,我收到以下消息:

FloatTest.cpp(2): warning C4305: 'initializing': truncation from 'double' to 'float'
FloatTest.cpp(4): error C2397: conversion from 'double' to 'float' requires a narrowing conversion
FloatTest.cpp(4): warning C4305: 'initializing': truncation from 'double' to 'float'
FloatTest.cpp(6): error C2397: conversion from 'double' to 'float' requires a narrowing conversion
FloatTest.cpp(6): warning C4305: 'initializing': truncation from 'double' to 'float'

此程序可在 Clang 3.0-3.8 和 GCC 4.5.4-6.1.0 上正常编译(使用 http://melpon.org/wandbox 测试),仅对未使用的变量发出警告。此外,删除/注释掉行 f4f6 会导致编译成功(只有一个警告行 f2)。

最初看起来 MSVC 只是告诉我 7.2 不能精确地表示为 float,所以它是一个收缩转换(这在大括号初始化中是非法的)。但是,标准 ( draft N3337 ) 第 8.5.4 节注释 7 是这样说的:

A narrowing conversion is an implicit conversion...

  • from long double to double or float, or from double to float, except where the source is a constant expression and the actual value after conversion is within the range of values that can be represented (even if it cannot be represented exactly)

强调我的。由于7.2在float可表示的取值范围内,所以其向float的转换按照标准不应该是窄化转换。 MSVC 在这里出错了吗,我应该提交错误吗?

最佳答案

它看起来确实像一个错误。作为解决方法,以下内容似乎可以消除 MSVC 2015 中的错误和警告。

#pragma float_control(precise, off, push)

float f2 = 7.2; // OK, with warning
//...

#pragma float_control(precise, pop)

如果使用 /fp:fast,则在全局范围内同样有效编译器开关,尽管那个与 /Za 不兼容这会禁用 MS 语言扩展。

关于c++ - MSVC 用 double 支撑初始化似乎违反了标准?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38275525/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com