堕天使の煉獄
2018-10
20
05:20:57
数式こわい
先日の続き~
とりあえず文字列クラスはこんでいいかーと見切りをつける。
あれから何か特筆すべき事といえば、やはりsprintf系のフォーマット書式はつかいものにならんなと。
str = glib::ustring::format(u8"%s : %d -- %s", u8"文字列", 20, u"utf16文字列");
こゆのがどうにも出来そうにない。
複数の文字コード入り交じった感じの。全部const wchar_t*固定てんなら簡単なんですが。
なんか頑張れば出来そうな方法ありそうではあるものの、えらく無駄が多い物になりそうで、とてもスマートでないものになりそう。
そもそも、ここ最近しばらくsprintf系なんて触ってなかったので、そうだっけ? となったのだけども、適用後の文字列格納するバッファのサイズを取得する_vscwprintfの時点で、間違った内容(%dに文字列を対応させちゃったり)にしたら例外でぶち落ちるのね。即オチなのは関数にnoexcept指定してるからかもだけど。
数値にしても型に対応してないし、文字列もchar or wcharしか使えないし、事前チェックの方法もなく誤ったパラメータ与えるとぶち落ちるってんじゃこりゃ使い物にならんなと。
まあそもそも、デバッグ出力用には随分昔にこのフォーマット書式タイプの物を長らく使ってた事があったので、このタイプのフォーマット書式タイプも懐古的に残しておくかなぐらいの感じで試してみたのですけどね。
結果、やはり苦労してこの方式にこだわるよりも、とっとと過去の遺物として葬り去るのがいいという結論にw
と言うことでフォーマット書式系は、普通に型にも細かいエラー対応も出来るQStringのarg()をぱくったやつのみで行くことに。
文字関係ではもう一つ。
utf-8,16,32対応版std::regexってかんじのSRELL
ttp://www.akenotsuki.com/misc/srell/
なのだけども。
なんでかうごかなーい。テンプレート関係のエラーがずらずらと。
なんでやーと別プロジェクトでシンプルな構成のものにしたら動く~。
とおもったらなんでかutf-16だけうごかなーい。
普通にバグ? ぽいですねこれ。
7568行目
typedef basic_regex<char16_t, u16regex_traits<char16_t> > u16regex;
↓
typedef basic_regex<char16_t> u16regex;
で動いたー!
char32_tの方にはテンプレートに二つ目のパラメータないのであるぇ? とおもったんだよなぁ。
でもほんとはutf32の方にも本来は二つ目必要で、さらに其の先でバグってるという可能性もなきにしもあらず。
てか、SRELL。掲示板とかオープンな場所での情報がまるでないので、こゆときこまるぅ。
あとやっぱテンプレート周りのエラーは見てもさっぱりわからんw
あとこれは環境の問題っぽいんだけど
#if defined(__cplusplus) && __cplusplus >= 201103L
こういうマクロでc++11以降対応してるか判定してるんだけども(char16_t,char32_tはc++11以降)msvcではデフォルトだと/std:c++latestとかしてても__cplusplusの中身は199711 Lのままだったりする……。
/Zc:__cplusplusコンパイラオプションを自前で追加しないとだめな模様。
そこでまず嵌る。
次に、そんなやったら既定オプションとして、プロジェクトの共通設定として書き込んだろ。とおもって、表示→プロジェクトマネージャ……あるぇー?
現在開いてるプロジェクト名だけしか出てこない。
前はここからプロジェクトのデフォルト設定を設定出来たのだけども。
なぜか未だに形だけ残ってるだけでじゃあ出来る場所に移動させろよでおなじみのvc++ディレクトリ設定なんかもそこで出来たのですが。
なんか覚え違いしてる? とググってみると……visualstudio2015以前までは出来たけどいまは出来なくなってるとの記述が……
今は共通設定はMicrosoft.Cpp.Win32.user.propsを直接編集エディタで開いて編集するしかないらしい。
……なんでそこまで共通設定を出来ないようにしたがるのだファッキン。
新規プロジェクト作る度に設定とかめんどくさすぎるだろうよ。
弊害が多いってんなら設定込みのテンプレ用意出来る用にするとかあるだろ……。
うち見たく、vc++使うのはDXライブラリつかったゲーム開発オンリーとか、限定された用途でしか使ってない場合だと、新規プロジェクト作った時点でDXライブラリへのパスとかは最初から設定されてて欲しいわけですよ。
他にも最近はもう使ってないけどboostとかSQLiteとかそのへんの外部ライブラリとかも。
これからは設定ファイルをエディタで開いて直接設定しなきゃ共通設定に設定出来ないとか、ほんとどうしてどんどん使いにくくしていくのかね。
んで、 /Zc:__cplusplusコンパイラオプション設定したあとビルドしたらまたSRELLでutf16使用するとエラー。
しばらく何処がおかしいのだと悩んだあげく、なんかエラー出力の感じがいつもと違うなと気づく。
今作ってるのは静的ライブラリとして作ってる部分で、エラーは本体の方のプロジェクトのmain.cppからエラーがでてるぽ。
……こっちのプロジェクトの方にも/Zc:__cplusplusコンパイラオプション設定しないとダメなのね。
ほらぁ、共通設定出来ないからこういう事に~ふぁーっく。
んで多倍長整数。
とりあえず、一桁を10億進数の多倍長整数クラスを作ってみたり。
あんま別けすぎても繰り上がりの処理が増えるだけだしってことで、最大数の9億9999...同士を掛けてもint64_tで収まるのでこれでいってみようと。
とりあえず足し算、引き算あたりは簡単に実装できる。
かけ算がややこしいなこれ。
事前に調べたKaratsuba法ってのは、それぞれ二分割したとき限定の方法だったのねこれ。
欲しかったのはn分割 * m分割 で速く計算できる方法だったのだけども。
そっちはToom-Cook法で、Karatsuba法はToom-2にあたるのだとか。
で、Toom-Cook法ての調べると、もう何が何やら。数式ばっかでゲボが出そうですよ。むりぽー。数学キライ-。
で、今のところこの多倍長整数が必要なのは、放置ゲーム的な物を一回作ってみようかなと思ってからの所なので、実際にゲームデザインとして、n桁 * m桁のかけ算てでてくるのかなぁと。ちな桁の一つは前述の10億進数での桁数です。
普通に考えて、n桁 * 1桁以外出てこないんじゃと。
可能性としてはn桁 * 1桁+小数部もあるか。倍率が小数点とかこの手のゲームではよく見るし。
そうなると、n桁 * 二桁だけあればよいのではと。
二桁限定なら普通の一桁ずつ掛けて足していく、普通の計算方法(筆算のときのあれ)で十分なんじゃないかと。コスト的にもn桁 * m桁のようにふくれあがることもなさそうだし。
小数部の計算結果用に、桁の右シフト(ついでに左シフトも)を用意しておけばあとはシンプルだなと。
そんな感じでかけ算も泥臭くはあるものの実装完了。
……割り算はさらに厄介そうなのと、そも使わないor小数部のかけ算(割る2なら0.5掛ける)とかである程度は代用できるし……ということで割り算は見なかったことにすることに。
んであとは多倍長整数の文字出力部分を。
一時は、もうめんどくさいからboostいれちゃうかなとおもったけど思いとどまった理由の一つに、boostの多倍長整数ライブラリは、文字出力が一括全桁しかないっぽいってのがあって。
結構この数値の文字化って重たい処理なんですよね。
で、毎度全桁出力とか無駄が多すぎるだろと。
実際的に使うのは、頭から5~6桁しか使わないわけですよ。
68.458quintillionとか1.58954 E+58とかこんな感じで。
なので必要な最小の桁だけ文字化する感じのがいいなーってところで、やっぱ自前で組むかーって流れだったりする。
しかし英語表記になると、結構諸説あってどれがポピュラーなのか判らないですね。途中で並びが違うのあったりとか、こっちにはなくてあっちにはあるなんてのもあったりして。
どれが正しいのかさっぱり判らん。
あとgoogolplexplexplexとかみただけで桁が想像も付かん……ってのもあるんですけど。
この手の放置系ゲームいくつもやってるとundecillionとかこのあたりぐらいまではなじみがあったりするので、だいたいどのくらいーてのがぼんやりと浮かんだりするんですけど。
とはいえScientific 科学的表記? ていうのの 1.123456+10
と、最上位一桁で其の桁までの桁数を後ろに+でつけるのは、数の大小はすぐに判別付くけど、ちょっと味気ないんだよなーというところもあって。
んでも日本表記だと桁が少なすぎる。無量大数にあっちゅーまに到達してしまう。あと単位の一つ、「杼(じょ)」これは正確でなく代用文字の方なんですけど、正式な方は外字で、表示できるか環境次第という問題なんかもあったりする。
細かいところでは日本式だと4桁区切りで単位が変わるのだけども、英数だと3桁区切りだったりする。
その辺で、多倍長整数の桁も9桁てのは3で割れるので英数だと扱いやすかったりする。
そんな感じで多倍長整数クラス出来。
数式怖い。
とりあえず文字列クラスはこんでいいかーと見切りをつける。
あれから何か特筆すべき事といえば、やはりsprintf系のフォーマット書式はつかいものにならんなと。
str = glib::ustring::format(u8"%s : %d -- %s", u8"文字列", 20, u"utf16文字列");
こゆのがどうにも出来そうにない。
複数の文字コード入り交じった感じの。全部const wchar_t*固定てんなら簡単なんですが。
なんか頑張れば出来そうな方法ありそうではあるものの、えらく無駄が多い物になりそうで、とてもスマートでないものになりそう。
そもそも、ここ最近しばらくsprintf系なんて触ってなかったので、そうだっけ? となったのだけども、適用後の文字列格納するバッファのサイズを取得する_vscwprintfの時点で、間違った内容(%dに文字列を対応させちゃったり)にしたら例外でぶち落ちるのね。即オチなのは関数にnoexcept指定してるからかもだけど。
数値にしても型に対応してないし、文字列もchar or wcharしか使えないし、事前チェックの方法もなく誤ったパラメータ与えるとぶち落ちるってんじゃこりゃ使い物にならんなと。
まあそもそも、デバッグ出力用には随分昔にこのフォーマット書式タイプの物を長らく使ってた事があったので、このタイプのフォーマット書式タイプも懐古的に残しておくかなぐらいの感じで試してみたのですけどね。
結果、やはり苦労してこの方式にこだわるよりも、とっとと過去の遺物として葬り去るのがいいという結論にw
と言うことでフォーマット書式系は、普通に型にも細かいエラー対応も出来るQStringのarg()をぱくったやつのみで行くことに。
文字関係ではもう一つ。
utf-8,16,32対応版std::regexってかんじのSRELL
ttp://www.akenotsuki.com/misc/srell/
なのだけども。
なんでかうごかなーい。テンプレート関係のエラーがずらずらと。
なんでやーと別プロジェクトでシンプルな構成のものにしたら動く~。
とおもったらなんでかutf-16だけうごかなーい。
普通にバグ? ぽいですねこれ。
7568行目
typedef basic_regex<char16_t, u16regex_traits<char16_t> > u16regex;
↓
typedef basic_regex<char16_t> u16regex;
で動いたー!
char32_tの方にはテンプレートに二つ目のパラメータないのであるぇ? とおもったんだよなぁ。
でもほんとはutf32の方にも本来は二つ目必要で、さらに其の先でバグってるという可能性もなきにしもあらず。
てか、SRELL。掲示板とかオープンな場所での情報がまるでないので、こゆときこまるぅ。
あとやっぱテンプレート周りのエラーは見てもさっぱりわからんw
あとこれは環境の問題っぽいんだけど
#if defined(__cplusplus) && __cplusplus >= 201103L
こういうマクロでc++11以降対応してるか判定してるんだけども(char16_t,char32_tはc++11以降)msvcではデフォルトだと/std:c++latestとかしてても__cplusplusの中身は199711 Lのままだったりする……。
/Zc:__cplusplusコンパイラオプションを自前で追加しないとだめな模様。
そこでまず嵌る。
次に、そんなやったら既定オプションとして、プロジェクトの共通設定として書き込んだろ。とおもって、表示→プロジェクトマネージャ……あるぇー?
現在開いてるプロジェクト名だけしか出てこない。
前はここからプロジェクトのデフォルト設定を設定出来たのだけども。
なぜか未だに形だけ残ってるだけでじゃあ出来る場所に移動させろよでおなじみのvc++ディレクトリ設定なんかもそこで出来たのですが。
なんか覚え違いしてる? とググってみると……visualstudio2015以前までは出来たけどいまは出来なくなってるとの記述が……
今は共通設定はMicrosoft.Cpp.Win32.user.propsを直接編集エディタで開いて編集するしかないらしい。
……なんでそこまで共通設定を出来ないようにしたがるのだファッキン。
新規プロジェクト作る度に設定とかめんどくさすぎるだろうよ。
弊害が多いってんなら設定込みのテンプレ用意出来る用にするとかあるだろ……。
うち見たく、vc++使うのはDXライブラリつかったゲーム開発オンリーとか、限定された用途でしか使ってない場合だと、新規プロジェクト作った時点でDXライブラリへのパスとかは最初から設定されてて欲しいわけですよ。
他にも最近はもう使ってないけどboostとかSQLiteとかそのへんの外部ライブラリとかも。
これからは設定ファイルをエディタで開いて直接設定しなきゃ共通設定に設定出来ないとか、ほんとどうしてどんどん使いにくくしていくのかね。
んで、 /Zc:__cplusplusコンパイラオプション設定したあとビルドしたらまたSRELLでutf16使用するとエラー。
しばらく何処がおかしいのだと悩んだあげく、なんかエラー出力の感じがいつもと違うなと気づく。
今作ってるのは静的ライブラリとして作ってる部分で、エラーは本体の方のプロジェクトのmain.cppからエラーがでてるぽ。
……こっちのプロジェクトの方にも/Zc:__cplusplusコンパイラオプション設定しないとダメなのね。
ほらぁ、共通設定出来ないからこういう事に~ふぁーっく。
んで多倍長整数。
とりあえず、一桁を10億進数の多倍長整数クラスを作ってみたり。
あんま別けすぎても繰り上がりの処理が増えるだけだしってことで、最大数の9億9999...同士を掛けてもint64_tで収まるのでこれでいってみようと。
とりあえず足し算、引き算あたりは簡単に実装できる。
かけ算がややこしいなこれ。
事前に調べたKaratsuba法ってのは、それぞれ二分割したとき限定の方法だったのねこれ。
欲しかったのはn分割 * m分割 で速く計算できる方法だったのだけども。
そっちはToom-Cook法で、Karatsuba法はToom-2にあたるのだとか。
で、Toom-Cook法ての調べると、もう何が何やら。数式ばっかでゲボが出そうですよ。むりぽー。数学キライ-。
で、今のところこの多倍長整数が必要なのは、放置ゲーム的な物を一回作ってみようかなと思ってからの所なので、実際にゲームデザインとして、n桁 * m桁のかけ算てでてくるのかなぁと。ちな桁の一つは前述の10億進数での桁数です。
普通に考えて、n桁 * 1桁以外出てこないんじゃと。
可能性としてはn桁 * 1桁+小数部もあるか。倍率が小数点とかこの手のゲームではよく見るし。
そうなると、n桁 * 二桁だけあればよいのではと。
二桁限定なら普通の一桁ずつ掛けて足していく、普通の計算方法(筆算のときのあれ)で十分なんじゃないかと。コスト的にもn桁 * m桁のようにふくれあがることもなさそうだし。
小数部の計算結果用に、桁の右シフト(ついでに左シフトも)を用意しておけばあとはシンプルだなと。
そんな感じでかけ算も泥臭くはあるものの実装完了。
……割り算はさらに厄介そうなのと、そも使わないor小数部のかけ算(割る2なら0.5掛ける)とかである程度は代用できるし……ということで割り算は見なかったことにすることに。
んであとは多倍長整数の文字出力部分を。
一時は、もうめんどくさいからboostいれちゃうかなとおもったけど思いとどまった理由の一つに、boostの多倍長整数ライブラリは、文字出力が一括全桁しかないっぽいってのがあって。
結構この数値の文字化って重たい処理なんですよね。
で、毎度全桁出力とか無駄が多すぎるだろと。
実際的に使うのは、頭から5~6桁しか使わないわけですよ。
68.458quintillionとか1.58954 E+58とかこんな感じで。
なので必要な最小の桁だけ文字化する感じのがいいなーってところで、やっぱ自前で組むかーって流れだったりする。
しかし英語表記になると、結構諸説あってどれがポピュラーなのか判らないですね。途中で並びが違うのあったりとか、こっちにはなくてあっちにはあるなんてのもあったりして。
どれが正しいのかさっぱり判らん。
あとgoogolplexplexplexとかみただけで桁が想像も付かん……ってのもあるんですけど。
この手の放置系ゲームいくつもやってるとundecillionとかこのあたりぐらいまではなじみがあったりするので、だいたいどのくらいーてのがぼんやりと浮かんだりするんですけど。
とはいえScientific 科学的表記? ていうのの 1.123456+10
と、最上位一桁で其の桁までの桁数を後ろに+でつけるのは、数の大小はすぐに判別付くけど、ちょっと味気ないんだよなーというところもあって。
んでも日本表記だと桁が少なすぎる。無量大数にあっちゅーまに到達してしまう。あと単位の一つ、「杼(じょ)」これは正確でなく代用文字の方なんですけど、正式な方は外字で、表示できるか環境次第という問題なんかもあったりする。
細かいところでは日本式だと4桁区切りで単位が変わるのだけども、英数だと3桁区切りだったりする。
その辺で、多倍長整数の桁も9桁てのは3で割れるので英数だと扱いやすかったりする。
そんな感じで多倍長整数クラス出来。
数式怖い。
Sun
Mon
Tue
Wed
Thu
Fri
Sat
01
02
03
■
■
台風よくくるな
04
■
■
遅々として
05
06
07
08
[体育の日]
09
10
11
12
13
14
15
■
■
c++の闇は深い
16
17
18
19
20
■
■
数式こわい
21
22
23
■
■
車輪~
24
25
26
27
28
29
30
31
total:2077061 t:69 y:504
■記事タイトル■
■年度別リスト■
2024年
2024年12月(0)2024年11月(0)
2024年10月(1)
2024年09月(2)
2024年08月(1)
2024年07月(1)
2024年06月(5)
2024年05月(2)
2024年04月(1)
2024年03月(6)
2024年02月(4)
2024年01月(3)
2023年
2023年12月(3)2023年11月(1)
2023年10月(2)
2023年09月(3)
2023年08月(3)
2023年07月(3)
2023年06月(7)
2023年05月(8)
2023年04月(2)
2023年03月(1)
2023年02月(2)
2023年01月(3)
2022年
2022年12月(4)2022年11月(3)
2022年10月(1)
2022年09月(3)
2022年08月(3)
2022年07月(2)
2022年06月(1)
2022年05月(3)
2022年04月(2)
2022年03月(2)
2022年02月(1)
2022年01月(6)
2021年
2021年12月(8)2021年11月(3)
2021年10月(4)
2021年09月(6)
2021年08月(2)
2021年07月(1)
2021年06月(3)
2021年05月(2)
2021年04月(2)
2021年03月(3)
2021年02月(1)
2021年01月(4)
2020年
2020年12月(3)2020年11月(7)
2020年10月(2)
2020年09月(3)
2020年08月(1)
2020年07月(3)
2020年06月(7)
2020年05月(5)
2020年04月(8)
2020年03月(4)
2020年02月(2)
2020年01月(4)
2019年
2019年12月(1)2019年11月(1)
2019年10月(2)
2019年09月(1)
2019年08月(3)
2019年07月(2)
2019年06月(2)
2019年05月(2)
2019年04月(4)
2019年03月(1)
2019年02月(7)
2019年01月(1)
2018年
2018年12月(1)2018年11月(1)
2018年10月(5)
2018年09月(1)
2018年08月(5)
2018年07月(1)
2018年06月(1)
2018年05月(1)
2018年04月(2)
2018年03月(2)
2018年02月(1)
2018年01月(1)
2017年
2017年12月(2)2017年11月(1)
2017年10月(2)
2017年09月(5)
2017年08月(8)
2017年07月(2)
2017年06月(1)
2017年05月(1)
2017年04月(3)
2017年03月(5)
2017年02月(7)
2017年01月(8)
2016年
2016年12月(7)2016年11月(2)
2016年10月(3)
2016年09月(7)
2016年08月(8)
2016年07月(10)
2016年06月(17)
2016年05月(6)
2016年04月(8)
2016年03月(10)
2016年02月(5)
2016年01月(10)
2015年
2015年12月(7)2015年11月(7)
2015年10月(13)
2015年09月(7)
2015年08月(7)
2015年07月(5)
2015年06月(4)
2015年05月(5)
2015年04月(2)
2015年03月(4)
2015年02月(1)
2015年01月(7)
2014年
2014年12月(12)2014年11月(8)
2014年10月(4)
2014年09月(6)
2014年08月(7)
2014年07月(4)
2014年06月(2)
2014年05月(5)
2014年04月(4)
2014年03月(8)
2014年02月(4)
2014年01月(8)
2013年
2013年12月(15)2013年11月(8)
2013年10月(3)
2013年09月(3)
2013年08月(8)
2013年07月(0)
2013年06月(0)
2013年05月(0)
2013年04月(0)
2013年03月(0)
2013年02月(0)
2013年01月(0)
■レス履歴■
■ファイル抽出■
■ワード検索■
堕天使の煉獄
https://rengoku.sakura.ne.jp
管理人
織田霧さくら(oda-x)
E-mail (■を@に)
oda-x■rengoku.sakura.ne.jp