最終更新日時:
が更新

履歴 編集

function
<cstdlib>

std::strtod

namespace std {
  double strtod(const char* nptr, char** endptr);
}

概要

文字列nptrdouble型の浮動小数点数に変換する。

  • endptrが非nullptrの場合、変換が終了した位置の文字へのポインタがそこに格納される
  • 先頭の空白は読み飛ばされ、その後の文字列が以下のいずれかの形式として解釈される
    • 10進数の浮動小数点数(1.5-3.25e10など)
    • 0x0Xで始まる16進浮動小数点数(0x1.8p3など)
    • INFINFINITY(大文字小文字を問わない)
    • NANNAN(文字列)(大文字小文字を問わない)

戻り値

  • 変換可能ならば変換後の数値を返す
  • 変換後の数値の絶対値が大きすぎて表現できない場合、HUGE_VAL(符号に応じて正または負)を返し、errnoERANGEを設定する
  • 変換後の数値の絶対値が小さすぎて表現できない場合、大きさがdoubleの最小の正規化数以下の値(0を含む)を返す。この場合にerrnoERANGEが設定されるかどうかは処理系定義である
  • 変換不可能ならば0を返す

備考

  • 小数点を表す文字は、現在のCロケールに依存する。ロケールに依存しない変換には、std::from_chars()(C++17)を使用する
  • 変換できたかどうかは、戻り値ではなくendptrnptrから進んだかどうかで判定する
  • 例外を送出するstd::stod()も使用できる

#include <iostream>
#include <cstdlib>

int main()
{
  char* end = nullptr;

  double a = std::strtod("3.14abc", &end);
  std::cout << static_cast<double>(a) << std::endl;

  // 変換が終了した位置以降の文字列
  std::cout << end << std::endl;

  // 16進浮動小数点数、無限大も解釈できる
  std::cout << static_cast<double>(std::strtod("0x1.8p3", nullptr)) << std::endl;
  std::cout << static_cast<double>(std::strtod("INFINITY", nullptr)) << std::endl;
}

出力

3.14
abc
12
inf

関連項目