目次: C言語とlibc
標準Cライブラリにはdoubleを返す三角関数(sin(), cos(), tan())とfloatを返す三角関数(sinf(), cosf(), tanf())が定義されています。
標準Cライブラリの一つの実装であるmuslのコードを見ると、sinf, cosf, tanfの計算にdouble演算を内部で使っています。これは基になったFreeBSDのlibmと同じ実装です。PCはfloatでもdoubleでも関係なく速いんですが、doubleをハードで扱えない貧相なプロセッサには優しくない作りです。
もう一つの実装であるnewlibのコードを見ると、double版のsin, cosこそFreeBSDの実装と同じですが、float版のsinf, cosfはfloatを使ったコードが独自に追加されていて、貧相なプロセッサにも優しい作りになっています。組み込みにやたら使われる実績は伊達じゃないですね。
じゃあmuslにnewlibのfloat版のsinf, cosfを移植すれば、doubleが苦手なプロセッサでも速くなるのでは?と思いました。
コードを触る前に、それぞれの実装の素性を調べておこうと思います。テスト方法は、
どうしてtanfだけ判定が甘いかというと、正しい値がわからなかったからです。なぜかglibcの実装も誤差1に収まっていません。どういうことなの……。
テストのコードはGitHubに置き(リンク)ました。特に難しい点はありませんが、muslとnewlibから三角関数を拝借するところは、やや面倒かもしれません。
現在のプロセッサは超速いし、問題の性質上マルチスレッド化も簡単ですから、32並列くらいで頑張れば32bit全域を調査しても3分もかかりません。楽勝ですね〜。
テスト結果は、当然、全て一致かと思いきや、そんなことはなかった。最初にテストしておいて良かったですね。
良い方から言うとmuslは内部でdoubleで演算しているからか、結果もパーフェクトでした。
一方のnewlibはcosfだけ変な値を返します。32bit全域を試してわずか6パターンです。
cos,cosf_newlib: NG : x:3fc90fe0 f:1.570797 d:1, exp:b52bbbd3 -0.000001, res:b52bbbd0 -0.000001 cos,cosf_newlib: NG : x:3fc90fe1 f:1.570797 d:1, exp:b54bbbd3 -0.000001, res:b54bbbd0 -0.000001 cos,cosf_newlib: NG : x:3fc90fe2 f:1.570797 d:1, exp:b56bbbd3 -0.000001, res:b56bbbd0 -0.000001 cos,cosf_newlib: NG : x:bfc90fe0 f:-1.570797 d:1, exp:b52bbbd3 -0.000001, res:b52bbbd0 -0.000001 cos,cosf_newlib: NG : x:bfc90fe1 f:-1.570797 d:1, exp:b54bbbd3 -0.000001, res:b54bbbd0 -0.000001 cos,cosf_newlib: NG : x:bfc90fe2 f:-1.570797 d:1, exp:b56bbbd3 -0.000001, res:b56bbbd0 -0.000001
正負を考慮(浮動小数点は最上位ビットが符号を示すビット)すると、実質3パターンで変な値が返ることがわかります。
誤差は3でした。ほぼ合ってます、おしい。誤差が出ることも不思議ですが、sinfは合っていてcosfだけ値がズレるのも不思議です。
Facebookのエディタはめちゃくちゃ重くて、添付の画像のように表示がおかしくなったり、突然カーソル位置が先頭に吹っ飛んだり、変な動きばかりします。
文章が長い場合は、他のテキストエディタで書いて張り付けた方が良いですね。
これはFacebookに長い文章を書くんじゃねえよ、と言いたいFacebookの意思なのかな……。
メモ: 技術系の話はFacebookから転記しておくことにした。
目次: ゲーム
最近Steamで購入したゲームTransport Fever 2(Good Shepherd Entertainment/Urban Games)にハマっています。在宅勤務を良いことに、仕事終わった瞬間から深夜までやりまくっていたら、プレイ時間が3週間で130時間に。やりすぎですね……。
Steamでは一定の条件を満たすと「実績」が解除されるシステムがあります。他のゲームでは、実績はほとんど気にしませんが、このゲームでは気になり59/61まで取りました。
もう1つ取れますが、最後の1個「大都市」は難しそうです。
Transport Fever 2を軽く紹介すると「輸送」シミュレーションゲームです。
シムシティから街を作る機能を除いて、交通網を作る機能のみを超強化したゲームとでもいいますか。A列車で行こう(アートディンク)をご存知でしたら、あのイメージが一番近いです。違いとしては、
プレイヤーが出来るのは、人と荷物の「輸送」のみです。輸送すると運賃が貰えるので、輸送網の維持費を上回る運賃を得て、輸送網を拡大するのが基本です。
ゲームの難易度は簡単です。人でも荷物でも同じですが、運びたいものを、運びたいところに真っ直ぐ運ぶ(運賃は道のりではなく、直線距離に応じる)だけで基本黒字です。めちゃくちゃしない限り、財政破綻はないはず。
むしろ序盤を過ぎると、資金が有り余って使い切れなくなるほどです。箱庭系ゲームでは、難易度が低いのは良いことで、資金を気にせず、レイアウトに凝ってみたり、道路縛りとか、鉄道縛りとか、比較的自由に遊べます。
その他の機能としては、動いている列車や車などのコックピットビューができます。自分が引いた鉄道や道路を走る様子をぼーっと見るのも楽しいです。
Steamでは素敵なModがたくさん公開されているので、お気に入りのマップや列車を探してみるのも楽しいかもしれません。
< | 2020 | > | ||||
<< | < | 04 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | - | - |
合計:
本日: