long double データ型のデフォルトのサイズを変更します。
Linux*: | なし |
Windows*: | /Qlong-double |
なし
オフ |
long double データ型のデフォルトのサイズは 64 ビットです。 |
このオプションは、long double データ型のデフォルトのサイズを 80 ビットに変更します。
ただし、このデータ型は 16 バイトでアライメントする必要があり、サイズはアライメントの倍数でなければならないため、Windows* では long double のサイズは 16 バイトになります。16 バイトの下位 10 バイト (80 ビット) にのみ、有効なデータが格納されます。
Windows* プラットフォームで Qlong-double コマンドライン・オプションを使用するには、double extended precision 浮動小数点型 (FP80) を使用するソースコードを、その使用を考慮またはサポートする方法で記述されていないソースコードと注意深く切り分ける必要があります。このオプションを使用すると、FP80 値のサイズやレイアウトを想定したり、要求するソースコードでは、コンパイル時、リンク時、または実行時にさまざまな不具合が発生する可能性があります。
Microsoft* C 標準ライブラリーと and Microsoft* C++ 標準テンプレート・ライブラリーは、FP80 データ型をサポートしていません。このオプションを使用する場合は、ライブラリーが FP80 データ型形式をサポートしているかどうかを必ず確認してください。
例えば、Microsoft* コンパイラーと Microsoft* が提供するライブラリー・ルーチン (printf や long double 数学関数など) は、80 ビット浮動小数点値をサポートしていないため、Qlong-double コマンドライン・オプションでコンパイルされるコードから呼び出されるべきではありません。
Microsoft* Visual Studio* 2019 バージョン 16.10 以降では、<complex> ヘッダー、<xutility> ヘッダー、または <cmath> ヘッダーを直接または間接的に含むプログラムで /std:c++latest と /Qlong-double を一緒に指定するとコンパイルエラーになる場合があります。以下の「例」セクションを参照してください。
なし
上記のとおり、<complex> ヘッダー、<xutility> ヘッダー、または <cmath> ヘッダーを直接または間接的に含むプログラムで /std:c++latest と /Qlong-double を一緒に指定すると問題が発生する場合があります。以下は、この問題の例です。
#include <iostream>
#include <complex>
int main()
{long double ld2 = 1256789.98765432106L;int iNan = isnan(ld2);std::cout << "Hello World!\n"; }
ksh-3.2$ icl -c -EHsc -GR -std:c++latest /Qlong-double /MD test1.cpp
Intel® C++ Intel® 64 Compiler Classic for applications running on Intel® 64, Version xxx Build xxxx
Copyright (C) 1985-2021 Intel Corporation. All rights reserved.
test1.cpp
c:/Program files/Microsoft Visual Studio/2022/Preview/VC/Tools/MSVC/14.29.30130/include/xutility(5918): error: no instance of function template "std::_Bit_cast" matches the argument list
argument types are: (const long double)
const auto _Bits = _Bit_cast<_Uint_type>(_Xx);
^
c:/Program files/Microsoft Visual Studio/2022/Preview/VC/Tools/MSVC/14.29.30130/include/xutility(67): note: this candidate was rejected because at least one template argument could not be deduced
_NODISCARD _CONSTEXPR_BIT_CAST _To _Bit_cast(const _From& _Val) noexcept {
^
detected during:
instantiation of "auto std::_Float_abs_bits(const _Ty &) [with _Ty=long double, <unnamed>=0]" at line 5967
instantiation of "bool std::_Is_finite(_Ty) [with _Ty=long double, <unnamed>=0]" at line 1307 of "c:/Program files/Microsoft Visual Studio/2022/Preview/VC/Tools/MSVC/14.29.30130/include/cmath"
instantiation of "_Ty std::_Common_lerp(_Ty, _Ty, _Ty) noexcept [with _Ty=long double]" at line 1392 of "c:/Program files/Microsoft Visual Studio/2022/Preview/VC/Tools/MSVC/14.29.30130/include/cmath"
compilation aborted for test1.cpp (code 2)