C標準では文字列→浮動小数点変換のエラーを移植性をもって検出する方法がない

No portable way to detect string-to-float conversion errors in standard C

C標準のstrtod系関数は、math_errhandlingマクロに従ってerrnoや浮動小数点例外でエラーを報告するが、POSIXは常にerrnoを設定するよう要求する。さらに無効な入力の場合、glibcはerrnoを変更しないがmuslはEINVALを設定するなど、実装間で動作が異なり、移植性のあるエラー検出手法が存在しない。標準の記述の曖昧さとPOSIXとの非互換性を指摘し、正しいチェック方法をまとめている。

異なる適合libcは、変換が実行できない場合に異なる動作をする可能性がある。実際、glibcではerrnoは0のままだが、muslはEINVALを設定する。これはLinuxのmanページには完全に文書化されていない。
  1. Joker_vD

    よく使われるプログラミング言語(FORTRANからJava/C#あたりまで)が、関数呼び出しから2つの値を人間工学的に返すことが歴史的にできなかったせいで、人々が狂ったようなAPIや契約をあれこれ発明してきたのは本当に驚くべきことだ。

    [double x, errno_t errno] = strtod(s, nullptr);

    if (errno != 0) {

    // ...

    }

    [x, _] = strtod(s, nullptr); // エラーが不可能だと確信しているか、単に気にしない場合

    その代わりに、せいぜい「戻り値が-1かどうか確認し、そうならグローバル変数errnoを確認する」程度、最悪の場合「この関数はエラーを実際には確実に報告しないので、不正なデータを渡すなよ、知らんけど」という状況に甘んじている。

  2. Panzerschrek

    Cの数値解析関数は、ロケール依存であるという根本的な欠陥がある。小数点があると仮定して数値を解析しても、開発者のマシンとは異なるロケールのシステムでは、突然点ではなくカンマになるというバグが多数ある。だから、ほぼ常にこれらを使うのは避けて、std::from_chars(新しいC++バージョンで利用可能)やその他のサードパーティライブラリを使うべきだ。

  3. gucci-on-fleek

    > これらの関数のLinux manページには、これについて全く言及されていない

    > manページがこれが拡張であることに一切触れていないという事実は、私には本当に注目に値する。

    > これはLinux manページでは完全に文書化されていない。

    Linux manページのメンテナは私の経験では本当に親切なので、彼らにこれを報告する価値はおそらくあるだろう [0] [1]。

    [0]: https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/...

    [1]: https://lore.kernel.org/linux-man/

  4. RossBencina

    長い間、Microsoftのstrtod実装は壊れていたので、ほとんどの人はnetlibか新しいアルゴリズムのどれかを使っていると思う。

    https://www.exploringbinary.com/visual-c-plus-plus-strtod-st...

    https://lemire.me/blog/2026/02/01/converting-floats-to-strin...

  5. chasil

    IEEE-754は厳しい女主人だ。

    https://en.wikipedia.org/wiki/IEEE_754

この日のほかの記事

2026-10-12