namespace std {
long double strtold(const char* nptr, char** endptr);
}
概要
文字列nptrをlong double型の浮動小数点数に変換する。
endptrが非nullptrの場合、変換が終了した位置の文字へのポインタがそこに格納される- 先頭の空白は読み飛ばされ、その後の文字列が以下のいずれかの形式として解釈される
- 10進数の浮動小数点数(
1.5、-3.25e10など) 0x/0Xで始まる16進浮動小数点数(0x1.8p3など)INF・INFINITY(大文字小文字を問わない)NAN・NAN(文字列)(大文字小文字を問わない)
- 10進数の浮動小数点数(
戻り値
- 変換可能ならば変換後の数値を返す
- 変換後の数値の絶対値が大きすぎて表現できない場合、
HUGE_VALL(符号に応じて正または負)を返し、errnoにERANGEを設定する - 変換後の数値の絶対値が小さすぎて表現できない場合、大きさが
long doubleの最小の正規化数以下の値(0を含む)を返す。この場合にerrnoへERANGEが設定されるかどうかは処理系定義である - 変換不可能ならば
0を返す
備考
- 小数点を表す文字は、現在のCロケールに依存する。ロケールに依存しない変換には、
std::from_chars()(C++17)を使用する - 変換できたかどうかは、戻り値ではなく
endptrがnptrから進んだかどうかで判定する - 例外を送出する
std::stold()も使用できる
例
#include <iostream>
#include <cstdlib>
int main()
{
char* end = nullptr;
long double a = std::strtold("3.14abc", &end);
std::cout << static_cast<double>(a) << std::endl;
// 変換が終了した位置以降の文字列
std::cout << end << std::endl;
// 16進浮動小数点数、無限大も解釈できる
std::cout << static_cast<double>(std::strtold("0x1.8p3", nullptr)) << std::endl;
std::cout << static_cast<double>(std::strtold("INFINITY", nullptr)) << std::endl;
}
出力
3.14
abc
12
inf
処理系
- Clang: 3.4 ✅
- GCC: 4.7.1 ✅
- Visual C++: 2019 ✅
備考
- 動作確認した範囲での最小バージョンを記載している。Clangは3.4(Compiler Explorerで利用できる最古のバージョン)、Visual C++は2019(同左)で動作を確認しており、それ以前のバージョンでも使用できる可能性がある