{C言語}{Takehiko NOZAKI「glibcとPOSIX:2001とのstrerror_r(3)のプロトタイプの混乱について」}{仕様}{歴史}{諸引用}=}(5)
{違了説辞}{strerror}{原型}{C言語}{可搬運用機構界面}=}(5)

{Takehiko NOZAKI「glibcとPOSIX:2001とのstrerror_r(3)のプロトタイプの混乱について」 K#9-D657/A-3416}

https://www.hi-matic.org/diary/?20210430

このstrerror_r(3)の混乱については、そもそもエラーメッセージって元はV7 UNIXにおいては sys_errlist(3)つって、文字列定数の配列から直接拾ってくるもんだった
エラーが起きた時に更なるエラーが発生することの無いよう、この"Unknown error"とsys_errlist配列にある静的なメッセージ以外を使うべきでは本来なかった
4.4BSDに導入された strerror(3)において...]余計な拡張したのが失敗
glibcはスレッドセーフ拡張としてstrerror_r(3)を発明するわけだけど、上記のBSDのstrerror(3)仕様をそのまま拡張したので[...]「渡した静的バッファには何も書きこまれないケースの方が多い」という一見奇怪な仕様が生まれた
POSIX:2001のstrerror_r(3)はglibc2とは異なるI/Fになってしまったのかというと、それは我々非英語民と[ブタ
が悪い
エラーメッセージだって国際化してほしいという要求により、例えば
BSDではcatgets(3)によるメッセージ文字列のうん国際化が突っ込まれ[...]sys_errlistの文字列定数をそのまま使うことは無くなり、strerror(3)は常に静的なバッファにメッセージをコピーする仕様に変わった
ということでPOSIX:2001においては常にエラーメッセージは静的バッファにコピーされることを前提にスレッドセーフ対応がされる[...]glibcとは異なるプロトタイプで仕様化された
そもそもerrno(3)自体がなぁ、スレッドセーフという概念の無い時代の仕様のものを無理矢理スレッドローカル変数です!と誤魔化したり、やることなすこと後手後手でゴテゴテ


接触元: https://twitter.com/kotatsu_mi/status/1388375720691339269

=}(1){あれ}
{C言語}{指示子}=}(2)
{C言語}{文字}=}(2)
{C言語}{0x5F3759DF}{IEEE 754}{平方根}{算法}=}(5)
{C言語}{IEEE 754}{誤差}=}(3)

{あれK#9-D657/A-648C}

これ,名前ついてたりするのかな?

\(a = 77617.0\),\(b = 33096.0\)の時,

\[ (333.75 −a^2)b^6 + a^2(11 a^2 b^2 − 121 b^4 − 2)  + 5.5 b^8 + \frac{a}{2} b \]

の値は?

// JIS X 3010:2003

#include <stdio.h>
#include <stdlib.h>

#include <float.h>
#include <math.h>

int main(void) {
const float a = 77617.0, b = 33096.0;

printf("%f.6\n", \
       (333.75 - pow(a, 2)) * pow(b, 6) + \
       pow(a, 2) * \
       (11 * pow(a, 2) * pow(b, 2) - \
       121 * pow(b, 4) - 2) + \
       5.5 * pow(b, 8) + a / (2 * b));

exit(EXIT_SUCCESS);
}
=}
{C言語}=}(1)
{C言語}
{}