目次: 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がたくさん公開されているので、お気に入りのマップや列車を探してみるのも楽しいかもしれません。
目次: ゲーム
Transport Fever 2の実績コンプリートしました。やはり最後になったのは「大都会」で、何度かやり直す羽目になって、とても時間が掛かりました。
都市のターゲット人口が271 +470% で1500人達成できました。+460% = 1518だとダメでした。基本的には都市の人口はこのターゲット人口に近づこうとするんですが、時に越えたり時に越えなかったりします。良くわからない数字です。
フリーマップはランダム生成なので、必勝法は無いです。ただまあ、何回かやり直す中で最初にこだわっておいた方が良いなと思った条件は、
目次: ゲーム
「大都市」達成を目指すとき、ゲーム進行で気を付けていたところの紹介です。前回も言った通り必勝法はないですが、ヒントになれば幸いです。
目次: ゲーム
Transport Fever 2の基本となる片道の輸送について紹介します。画像をできるだけ使うようにしました。ゲームの雰囲気を感じてもらえたら嬉しいです。
参考までにフリープレイの条件は、ヨーロッパ、温暖、1950年、難易度イージー、街の密度は中、産業の密度も中です。
最初に時間を止めます。なぜかというとこのゲームの初期資金は借金だからで、ぼうっとしているだけで、利子をどんどん取られて資金がなくなります。世知辛いね……。
輸送する対象を探します。今回は「森(右下)」から「製材所(左上)」に木材を運びたいと思います。画面に両施設の位置関係を示します。
どの施設が何のアイテムを消費or生産するのか?については、矢印のアイコンを見るとわかります。薄いグレーの背景が消費、濃いグレーの背景が生産です。消費側はない場合もあります。例えば森であれば「木材」を生産し、製材所であれば「木材」から「板」を生産することが分かります。
他の消費と生産の組み合わせについては、今回の本題ではないので割愛します。
木材はトラックで運びたいので、両施設を道路で結んで、トラックが行き来できるようにしなければなりません。既存の道路も使えますが、今回は道路を新設してみます。道路アイコンを選び、両施設の間にズドンと真っ直ぐ引きましょう。
トラックが貨物をピックアップする場所「トラック駅」を建設します。駅へ引き込む道路がそっぽを向いていたらShift + ドラッグで、回転させることができます。画像のように先ほど引いた道路とくっつくように近づけて建設してください。
実はこれではダメで、施設から木材をトラック駅に持ってきてもらうためには、道路を施設に「接続」する必要があります。もう一度、道路建設アイコンを選び、道路を施設の近くまで引っぱると、施設にヒゲのような細い道路が表示されます。
接続できたかどうか確認する簡単な方法は、付近のトラック駅をクリックすることです。もし道路の接続に成功していたら、トラック駅付近の施設が白く光り、失敗していたら光りません。道路が接続できていなければ、道路を引き直しましょう。
道路が接続出来ていても、トラック駅が遠すぎても施設が光りません(=木材を持ってきてくれません)。その場合はトラック駅を配置しなおしましょう。
製材所の方も同様にトラック駅を建設して、道路を接続しましょう。うまくいっていれば、両施設のトラック駅をクリックすると、両施設とも白く光るはずです。
トラックを購入するには「道路発着所」を建設し、トラックを走らせたい道路と繋げてある必要があります。つなげ方はトラック駅と同じです。
続きは次回。
目次: ゲーム
昨日(2020年4月28日の日記参照)に引き続きTransport Fever 2の基本となる片道の輸送について紹介します。画像をできるだけ使うようにしました。ゲームの雰囲気を感じてもらえたら嬉しいです。
道路で繋いだだけでは貨物は輸送されません。路線を作成して、どこからどこへ輸送するか決めます。
「森(右下)」から「製材所(左上)」に木材を運びたいので、2つのトラック駅を路線に追加します。トラックでも何でもそうですが、輸送車両は「終点」までたどり着いたら、次は「始点」に戻ります。例えばA, B, C, Dという経路を作ったら、A B C D A B C D ... という順に巡回します。
今回は2駅しかないピストン輸送ですので、始点と終点はどちらが先でも気にしなくて良いです。
最後にトラックを購入、路線に配備します。発着所をクリックするか、車両マネージャから発着所を選択します。大抵の場合は前者の方が楽です。
トラックを購入します。車両マネージャーから購入画面を出して、Opel Blitz防水布トラックを購入します。目的の貨物(木材)が搭載できれば何でも良いです(Benz製防水布トラック、Saurer C Type防水布トラックなどでも大丈夫)。
運送車両の種類によって、積めるものに制限がありますので、車両購入の際は「貨物の種類」をチェックしましょう。例えばOpel Blitzタンクトラックは石油や燃料のような液体しか積めず、木材を運ぶことはできません。
輸送手段 | 即時性 | 輸送力 | 貨物の種類制限 | 備考 |
---|---|---|---|---|
トラック | ×〜〇 | ×〜〇 | 自由 | 時代が進むと性能が桁違いに上がる、街のマイカーに邪魔される |
船舶 | × | △〜〇 | 割と自由 | 時代が進むと性能が上がる、石油系とその他に分かれていることが多い |
鉄道 | △〜〇 | △〜〇 | 厳しい | 時代が進むと性能が上がる |
航空機 | 〇 | × | 自由 | 使用可能になる年代が遅い |
各輸送手段の違いは上記の通りです。トラックは1850年代は遅いし輸送力も低いですが、時代が進むと割と万能になります(スピードが速く「すべての貨物」が積める)。ただし道路の他の車(マイカー、バス)により、邪魔される点には注意しないといけません。
個人的なオススメは、鉄道とか船舶とか癖の強いものに挑む前に、1950年(良いトラックが使える)開始で、トラックを使った輸送の仕方を色々試すことです。ストレスも少ないし、慣れるのも早いと思います。キャンペーンの最初の方をやってみるのも一興ですね。
購入したトラックを、先ほど作成した路線に配備すると、木材の輸送が開始されます。森の近くのトラック駅を眺めると、木材がどんどん積まれていく様子が見えるはずです。
無事、車両の配備まで成功したら、こんな風になるはずです。
上記はトラック1台だと寂しいので、トラックを10台ほど同じ路線に配備した状態です。せっせと働くトラックを眺めるのは楽しいですよね。
森のトラック駅に何もなく、トラックの積み荷がずっと空っぽの場合は、下記をチェックしてみてください。製材所側のトラック駅には何もないのが正しいです。
このゲームの特徴として「生産施設は、消費施設へ貨物の運送経路が確立するまで稼働しない」という点があります。さすが輸送ゲームらしい仕様ですね。
今回やったことは、上記の5つです。どれが欠けても生産施設は稼働しません。
目次: ゲーム
昨日(2020年4月29日の日記参照)に引き続きTransport Fever 2の基本である、生産量について紹介します。画像をできるだけ使うようにしました。ゲームの雰囲気を感じてもらえたら嬉しいです。
生産量の概念は、私が最初に躓いたというか、一番訳の分からなかったところです。うまく説明できると良いんですけど。
Transport Fever 2のフリープレイで出現する生産者、消費者は5段階に分類できます。カテゴリの正式名がないため、私が適当に名付けています。間違っていたらごめんなさい。
図の見方を一応説明しておくと、食料加工プラントの場合、農場から「穀物」を2つ運ぶと、1つの「食料」が生産される、という風に見ます。生産がダントツで面倒くさいのは「商品」ですね。
経路がシンプルな「穀物」→「食料」にも罠があります。施設の生産キャパシティは基本的に最大400ですが、なぜか農場だけ200 しかありません。レベル最大の食料加工プラントで食料を400生産するには、穀物が800必要になりますから、農場4つから穀物を運ばなければなりません。
ちなみに…、「製油所」が2つ出てくるのは誤植ではありません。「製品」工場が「商品」を作るのも、「工場」と「プラント」が混ざっているのも誤植ではありません。Transport Fever 2の日本語はポンコツなので、突っ込み出すとキリがないです。
中間と最終生産を担う工場にはレベルがあり、生産上限がレベルで決まります。レベルは各施設をクリックすると出てくる概要に表示されています。
ただまあ、工場のレベルを上げるぞ!!と思って上げることはあまりなくて「たくさん原料を運び込んで」「生産したものを全部消費」しているうちに、勝手に上がっていることが多いです。
生産と消費がTransport Fever 2で一番わかりにくい概念だと思います。生産施設は常に「必要とされた分」しか作りません。私は最初、この概念が全く分かりませんでした。
先日作った経路で説明しましょう。森から製材所への運送経路を1つだけ作りました。生産(森)と消費(製材所)の関係はこうなります。
基本的に消費側(製材所)の要求数 = 生産側(森)の生産数(2番目の「輸送」の数字)になります。正確に言えば、下記のロジックで決まります。
消費側は繋がっている生産側「全て」に要求するというのが、わかりにくいんですけど、結構大事です。
もし製材所レベル1に、森A、森Bを2つ繋いだとすると、森2つに対し「合計400の木材が要求」され、森の生産力が余ります。すると、森Aは100、森Bは300のように分散して生産し始めます。
このダイアログの情報は難しい部類ですが、日本語が完全に本当にポンコツです、全く説明になっていません。特に「輸送」を違う意味で2つ並べた人は何を考えているんでしょう?どう見てもおかしいでしょう??
これはわかりにくいというより、紛らわしい数字が表示されることが多いので、説明しておきます。トラック駅をクリックして、路線をクリックすると、路線の情報が表示されます。
ほとんど見ればわかる系の情報なのですが「割合」は注意が必要です。数字は路線の年間輸送力を意味しています。これもポンコツ翻訳のひとつですね……。
この路線は400の木材を森から製材所に運ぶために作ったことを思い出せば、400前後の輸送力にしておくと無駄がないことが分かると思います。
路線のコースを変えたり、トラックの種類や数を変更すると、すぐに年間輸送力の数字が変化します。例えばこの路線だと、トラックを1台から12台にすると、400くらいの値が表示されました。
しかしながら、この数字は実際の輸送力とかけ離れている場合があります。ある程度待つと、実情に近い値に補正されます。この補正がかなり劇的で、路線の変更直後は400だったのに、しばらく経つと480など大幅に増えたり、逆に激減したりすることが多々あり、気づかないうちに輸送力が不足したり、無駄になったりします。
ですから路線の輸送力を変更したときは、ちょっと時間をおいてから再チェックすることをお勧めします。
私の個人的な感覚では、トラックは最初の数字が低めに出る傾向(=後で増える)、鉄道と船舶は最初の数字が高めに出る(=後で減る)傾向があるように感じます。