C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/
C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf
C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/
前
C言語なら俺に聞け 144
https://mevius.5ch.net/test/read.cgi/tech/1514025223/
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512
-
※前スレ
C言語なら俺に聞け 145
http://mevius.5ch.net/test/read.cgi/tech/1519046038/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
探検
C言語なら俺に聞け 146
レス数が900を超えています。1000を超えると表示できなくなるよ。
1デフォルトの名無しさん (ワッチョイ 839f-AnMQ)
2018/04/30(月) 04:47:37.50ID:XX4FB8lc0803デフォルトの名無しさん (スップ Sd1f-3fy2)
2018/08/07(火) 12:50:36.34ID:1Vrs+If4d 誤差www
そりゃアホが作れば誤差が問題になるだろうねえwww
そりゃアホが作れば誤差が問題になるだろうねえwww
804デフォルトの名無しさん (スップ Sd1f-3fy2)
2018/08/07(火) 12:51:27.81ID:1Vrs+If4d アホは素直に加算を繰り返せば良いよ
805デフォルトの名無しさん (アウアウカー Sa07-iFcb)
2018/08/07(火) 17:18:17.21ID:r/NXRNz/a あれ?今日は半角にしないんだ。
806デフォルトの名無しさん (スップ Sd1f-3fy2)
2018/08/07(火) 19:11:24.43ID:PQcYGo+5d おれは半角野郎じゃない
半角野郎はアホだから無理
半角野郎はアホだから無理
808デフォルトの名無しさん (ワッチョイ cf01-Xflc)
2018/08/07(火) 20:18:00.72ID:8+yE0dxd0 富士山麓オウム啼く・・・あれ?怖いなこれ
809デフォルトの名無しさん (ワッチョイ cf80-gYkF)
2018/08/07(火) 22:59:36.12ID:5k05bDr80810デフォルトの名無しさん (ワッチョイ cf80-gYkF)
2018/08/07(火) 23:08:45.73ID:5k05bDr80811デフォルトの名無しさん (ワッチョイ 6350-3fy2)
2018/08/07(火) 23:43:22.81ID:JmB8aria0 相変わらずアホだね
視野が狭い
視野が狭い
812デフォルトの名無しさん (ワッチョイ 4381-Xflc)
2018/08/07(火) 23:47:20.78ID:oCoNsgzD0 ルートとn乗求める処理オーダーってどんなんじゃろ
64bitまでならルート使ったほうが早いだろうけど
結局桁数が大きくなったらルートとってn乗してって結構処理重そう
じつは全部足し算したほうが早かったりして
64bitまでならルート使ったほうが早いだろうけど
結局桁数が大きくなったらルートとってn乗してって結構処理重そう
じつは全部足し算したほうが早かったりして
813デフォルトの名無しさん (ワッチョイ cf01-Xflc)
2018/08/08(水) 05:09:15.02ID:d90b/R1Y0 重いのはべき乗のほうだね
814デフォルトの名無しさん (ワッチョイ 6350-3fy2)
2018/08/08(水) 07:15:16.24ID:UEEWq45u0 nが大きい場合の計算オーダー
足し算の繰り返しの場合 : n^2
一般項を普通に計算した場合 : n (log n)^2
足し算の繰り返しの場合 : n^2
一般項を普通に計算した場合 : n (log n)^2
815デフォルトの名無しさん (ワッチョイ 6323-SE3Y)
2018/08/08(水) 09:01:38.18ID:IJcCYJpk0 足し算の繰り返し:O(n)
一般項:O(1)
じゃないの?
一般項:O(1)
じゃないの?
816デフォルトの名無しさん (スップ Sd1f-3fy2)
2018/08/08(水) 12:44:41.36ID:DBa81iRmd 加算、乗算、expなどの計算がO(1)で出来る範囲ならそうだね
817デフォルトの名無しさん (ブーイモ MMa7-3LBS)
2018/08/08(水) 12:50:59.40ID:CvCa/3U5M >>816
まずはO(1)の定義を調べようか…
まずはO(1)の定義を調べようか…
818デフォルトの名無しさん (スップ Sd1f-3fy2)
2018/08/08(水) 12:52:04.40ID:DBa81iRmd お前より詳しいと思うよ
819デフォルトの名無しさん (ワッチョイ ff73-lyTv)
2018/08/08(水) 15:07:25.41ID:FOgunlIR0 お前のほうが可愛いよ
820デフォルトの名無しさん (スップ Sd1f-3fy2)
2018/08/08(水) 16:09:12.75ID:H7dQbZh7d ありがと
821デフォルトの名無しさん (ワッチョイ 6350-Xflc)
2018/08/08(水) 18:58:28.93ID:UEEWq45u0 フィボナッチの私の回答
nが比較的小さな数までである場合、テーブルを持つのが最速であることは間違いない
じゃあテーブルを持たない場合、
固定有効精度であれば、以下で求めるのが計算量のオーダーが1
(int)(exp(.4812118250596034475*n-.8047189562170501873)+0.5)
floatやdoubleではなく、4倍精度や100倍精度であってもオーダーは1
上の2個の定数は事前に計算しておけばいいし、
毎回計算してもnとは無関係
nが非常に小さい数でなければ単純に加算するよりは上記の方が速いでしょう
floatやdoubleであれば1行で済みます
nが比較的小さな数までである場合、テーブルを持つのが最速であることは間違いない
じゃあテーブルを持たない場合、
固定有効精度であれば、以下で求めるのが計算量のオーダーが1
(int)(exp(.4812118250596034475*n-.8047189562170501873)+0.5)
floatやdoubleではなく、4倍精度や100倍精度であってもオーダーは1
上の2個の定数は事前に計算しておけばいいし、
毎回計算してもnとは無関係
nが非常に小さい数でなければ単純に加算するよりは上記の方が速いでしょう
floatやdoubleであれば1行で済みます
822デフォルトの名無しさん (ワッチョイ 6350-Xflc)
2018/08/08(水) 19:03:59.97ID:UEEWq45u0 じゃあ多倍長演算を用いて任意のnに対して正確に求める場合を考える
以下は基礎知識
n番目のフィボナッチ数の桁数はnに比例する
乗算の計算オーダーは、桁数をnとすると n log(n)
ルートの計算オーダーは n log(n)
n乗は、オーダーlog(n)回の乗算で求まる
以上より、一般項の式の通りまじめに計算しても
オーダー n (log n)^2 で計算できる
以下は基礎知識
n番目のフィボナッチ数の桁数はnに比例する
乗算の計算オーダーは、桁数をnとすると n log(n)
ルートの計算オーダーは n log(n)
n乗は、オーダーlog(n)回の乗算で求まる
以上より、一般項の式の通りまじめに計算しても
オーダー n (log n)^2 で計算できる
823デフォルトの名無しさん (ワッチョイ 6350-Xflc)
2018/08/08(水) 19:10:00.90ID:UEEWq45u0 工夫すると、計算オーダーを n log n にすることが出来る
行列の形でフィボナッチ数列の漸化式を記述すると
|0 1|^n |0|
|1 1| . . |1|
でn番目とn+1番目のフィボナッチ数が求まることがわかる
この式を用いれば
計算オーダー n log n で正確に n 番目のフィボナッチ数を求めることができる
行列の形でフィボナッチ数列の漸化式を記述すると
|0 1|^n |0|
|1 1| . . |1|
でn番目とn+1番目のフィボナッチ数が求まることがわかる
この式を用いれば
計算オーダー n log n で正確に n 番目のフィボナッチ数を求めることができる
>>810,812,814
漸化式 f(n+2)=f(n+1)+f(n) から一般のf(n) を求めるオーダーはΟ(n)
一般式 >>807 から求めるオーダーはΟ(log n)
だと思う
https://mevius.5ch.net/test/read.cgi/tech/1434079972/49
c を定数として、c^n を求めるにはΟ(log n) でいける
漸化式 f(n+2)=f(n+1)+f(n) から一般のf(n) を求めるオーダーはΟ(n)
一般式 >>807 から求めるオーダーはΟ(log n)
だと思う
https://mevius.5ch.net/test/read.cgi/tech/1434079972/49
c を定数として、c^n を求めるにはΟ(log n) でいける
825デフォルトの名無しさん (スップ Sd1f-3fy2)
2018/08/08(水) 19:30:35.51ID:xXLtNtIVd826デフォルトの名無しさん (スップ Sd1f-3fy2)
2018/08/08(水) 19:34:04.93ID:xXLtNtIVd827デフォルトの名無しさん (スップ Sd1f-3fy2)
2018/08/08(水) 19:36:02.18ID:xXLtNtIVd 固定精度であれば
四則演算もexpも丸めも全て
値によらず固定時間で計算出来る
四則演算もexpも丸めも全て
値によらず固定時間で計算出来る
828デフォルトの名無しさん (スップ Sd1f-3fy2)
2018/08/08(水) 19:41:56.80ID:xXLtNtIVd てことで、
半角君に3勝ですね
コーディング
アルゴリズム
数学
全て勝ってしまった
まあ学歴も勝ってると思うので4勝か
半角君に3勝ですね
コーディング
アルゴリズム
数学
全て勝ってしまった
まあ学歴も勝ってると思うので4勝か
829デフォルトの名無しさん (ワッチョイ cf81-Xflc)
2018/08/08(水) 19:42:03.28ID:bSSLrH090 >>824
桁数分のnかからんの?
桁数分のnかからんの?
831デフォルトの名無しさん (ガラプー KK87-/9RV)
2018/08/08(水) 21:38:16.32ID:Iprz26WCK 頭悪いバカが半角に勝ったつもりでいる
半角はこのスレでは間違いなく天才
他のやつらがお話にならないぐらい頭悪いからな
典型的な頭悪いやつが半角に勝とうと必死になってる
半角はこのスレでは間違いなく天才
他のやつらがお話にならないぐらい頭悪いからな
典型的な頭悪いやつが半角に勝とうと必死になってる
832デフォルトの名無しさん (ワッチョイ cf81-Xflc)
2018/08/08(水) 23:31:41.87ID:bSSLrH090 ここまで一般式も行列もコードなし多倍長も
まだはじまってもいない
まだはじまってもいない
833デフォルトの名無しさん (ワッチョイ 4364-vmb7)
2018/08/08(水) 23:37:23.86ID:85EJM9li0 ISO C99に準拠して、なおかつある程度開発が盛んなOSSを教えてください。
ソースコードが綺麗なことで有名ならなお嬉しいです。
ソースコードが綺麗なことで有名ならなお嬉しいです。
>>832
多桁長は結構手間、というか C/C++ でやるのは実は大変だと思います、キャリーフラグが使えない…
多桁長は結構手間、というか C/C++ でやるのは実は大変だと思います、キャリーフラグが使えない…
835デフォルトの名無しさん (ワッチョイ 0b50-+oCX)
2018/08/09(木) 08:27:30.86ID:RmtKVlli0 素直にライブラリを使えば良いよ
加減乗算しか使わないから
速度を求めなければ自作するのも大した手間では無いけど
加減乗算しか使わないから
速度を求めなければ自作するのも大した手間では無いけど
836デフォルトの名無しさん (ワッチョイ 0b23-BtOx)
2018/08/09(木) 08:39:55.95ID:+YHL5mth0 >>833
勉強のためなのかな
もしそうならFreeBSDのコマンドのソースコードが良いと思う
短いものが多いからおすすめ
Linuxのものと比べると読みやすい
FreeBSDソースコードリポジトリ
https://svnweb.freebsd.org/base/release/11.2.0/
"bin"が名前に含まれるフォルダにコマンドのソースがある
勉強のためなのかな
もしそうならFreeBSDのコマンドのソースコードが良いと思う
短いものが多いからおすすめ
Linuxのものと比べると読みやすい
FreeBSDソースコードリポジトリ
https://svnweb.freebsd.org/base/release/11.2.0/
"bin"が名前に含まれるフォルダにコマンドのソースがある
837デフォルトの名無しさん (ワッチョイ 8a73-/icg)
2018/08/09(木) 10:23:18.39ID:vVjcL3xq0 GNUのツールチェインもいいんじゃないか
ストールマンのコードとか見れるよ
ストールマンのコードとか見れるよ
838デフォルトの名無しさん (ワッチョイ 0364-WYJg)
2018/08/09(木) 10:24:09.98ID:FWE3MOHN0 >>836
ありがとうございます。
> 勉強のため
その通りです。
プログラム言語自体がほぼ初めてなのですが
やはり教科書や仕様書ばかり見て 実際を見ないのでは身に付かない
と思いまして、OSSのソースコードであれば
コーディング規約が守られていたり
優秀なアルゴリズムが使われていたりするかなと予測して
OSSのソースコードリーディングをすることにしました。
ところが私が勉強の対象にしているのはISO/IEC 9899:1999(C99)であるのに対し、
ほとんどの有名なOSSはC89/90に準拠し、その古い制約に縛られていてC99の勉強の妨げになりそうでした。
というわけでC99に準拠した有名なOSSを探しているのです。
ありがとうございます。
> 勉強のため
その通りです。
プログラム言語自体がほぼ初めてなのですが
やはり教科書や仕様書ばかり見て 実際を見ないのでは身に付かない
と思いまして、OSSのソースコードであれば
コーディング規約が守られていたり
優秀なアルゴリズムが使われていたりするかなと予測して
OSSのソースコードリーディングをすることにしました。
ところが私が勉強の対象にしているのはISO/IEC 9899:1999(C99)であるのに対し、
ほとんどの有名なOSSはC89/90に準拠し、その古い制約に縛られていてC99の勉強の妨げになりそうでした。
というわけでC99に準拠した有名なOSSを探しているのです。
839デフォルトの名無しさん (JP 0Heb-5Ep3)
2018/08/09(木) 10:43:20.34ID:fhYwVVV8H C89とC99の差を何も見ずにここに書けるなら別だが、
そうでなければ勉強の妨げにはならんから安心しろ
そうでなければ勉強の妨げにはならんから安心しろ
840デフォルトの名無しさん (ワッチョイ 9e01-2km2)
2018/08/09(木) 10:54:41.59ID:wz655HRh0 多倍長ならGMPがあるやん
841デフォルトの名無しさん (ブーイモ MM27-AujL)
2018/08/09(木) 12:48:19.15ID:9ZSWxBpXM >>838
musl libc
musl libc
843デフォルトの名無しさん (ワッチョイ 0381-2km2)
2018/08/09(木) 22:23:11.20ID:MlnftC8O0 もうつくったんかはええw
順次加算とスピード同じくらい?
順次加算とスピード同じくらい?
845デフォルトの名無しさん (スップ Sd8a-+oCX)
2018/08/09(木) 23:30:35.12ID:8Br7DHMpd コードを見てないけど
多倍長は乗算がキモ
オーダーn log nで計算する方法を考えよう
フーリエ変換を使うのが普通
多倍長は乗算がキモ
オーダーn log nで計算する方法を考えよう
フーリエ変換を使うのが普通
846デフォルトの名無しさん (スップ Sd8a-+oCX)
2018/08/09(木) 23:45:29.15ID:8Br7DHMpd847デフォルトの名無しさん (ワッチョイ cebe-tyrq)
2018/08/10(金) 01:21:54.58ID:r84RRSaO0848デフォルトの名無しさん (ワッチョイ de80-oNxq)
2018/08/10(金) 21:12:30.49ID:Ao+gKXlH0 とりあえずこの前インストールした仮想環境のlinuxにgmplibをインストールした
相変わらず低学歴知恵遅れどもは頭悪いテキトーなことばっかりいってるわ
相変わらず低学歴知恵遅れどもは頭悪いテキトーなことばっかりいってるわ
849デフォルトの名無しさん (ワッチョイ de81-2km2)
2018/08/10(金) 23:14:02.99ID:z8f8fUe70 俺なんかGoogleのAIライブラリのTensolFlowインストールしたぞ!
インストールしたぞ
インストールしたぞ
850デフォルトの名無しさん (ワッチョイ 0b50-2km2)
2018/08/10(金) 23:55:30.59ID:Jbhl98S70 >>823の方針でフィボナッチ数を計算するコードを書いてみました
F(1億) が10.5秒
F(10億) が137.1秒
Cで450行くらいのコード
計算時間より秀丸エディタで結果を開く方が時間がかかってました
F(10) : time = 0.000013 / err = 0.000000
F(100) : time = 0.000017 / err = 0.000000
F(1000) : time = 0.000021 / err = 0.000000
F(10000) : time = 0.000111 / err = 0.000000
F(100000) : time = 0.001233 / err = 0.000001
F(1000000) : time = 0.019993 / err = 0.000004
F(10000000) : time = 0.251717 / err = 0.000019
F(100000000) : time = 10.507523 / err = 0.000076
F(1000000000) : time = 137.143945 / err = 0.000305
F(1億) が10.5秒
F(10億) が137.1秒
Cで450行くらいのコード
計算時間より秀丸エディタで結果を開く方が時間がかかってました
F(10) : time = 0.000013 / err = 0.000000
F(100) : time = 0.000017 / err = 0.000000
F(1000) : time = 0.000021 / err = 0.000000
F(10000) : time = 0.000111 / err = 0.000000
F(100000) : time = 0.001233 / err = 0.000001
F(1000000) : time = 0.019993 / err = 0.000004
F(10000000) : time = 0.251717 / err = 0.000019
F(100000000) : time = 10.507523 / err = 0.000076
F(1000000000) : time = 137.143945 / err = 0.000305
851デフォルトの名無しさん (ワッチョイ 0b50-2km2)
2018/08/11(土) 00:06:54.68ID:N9ICkOCi0 10000進数多倍長
超単純なFFT
演算は乗算と加算のみ
誤差の感じから100000進数でも大丈夫そうですね
計算式は基本以下を多倍長にしただけ
多少の無駄は除いてますが
----
uint64_t f(uint64_t n){
n++;
uint64_t a = 1;
uint64_t b = 0;
uint64_t t;
for (int i = 0 ; i < 64 ; i++){
t = b * b;
b = 2 * a * b + t;
a = a * a + t;
if (n & 0x8000000000000000){
t = b;
b = a + b;
a = t;
}
n += n;
}
return a;
}
超単純なFFT
演算は乗算と加算のみ
誤差の感じから100000進数でも大丈夫そうですね
計算式は基本以下を多倍長にしただけ
多少の無駄は除いてますが
----
uint64_t f(uint64_t n){
n++;
uint64_t a = 1;
uint64_t b = 0;
uint64_t t;
for (int i = 0 ; i < 64 ; i++){
t = b * b;
b = 2 * a * b + t;
a = a * a + t;
if (n & 0x8000000000000000){
t = b;
b = a + b;
a = t;
}
n += n;
}
return a;
}
852デフォルトの名無しさん (ワッチョイ 0b50-2km2)
2018/08/11(土) 00:16:27.47ID:N9ICkOCi0 コードをアップしようと思ったけど
ideoneだとうまく動かないみたい
ideoneだとうまく動かないみたい
853デフォルトの名無しさん (ワッチョイ 9f2d-IVAT)
2018/08/11(土) 10:03:32.46ID:ONHM6Q8h0 乙
じゃ、多倍長使って一般項の公式で算出したケースを晒します
スレチと知りつつ C++ で boost/multiprecision バックエンドは gmp
https://wandbox.org/permlink/QqxaauQeHTjJRrYX
# fib(0) .. fib(1000) + fib(10億)
real 0m0.004s
user 0m0.004s
sys 0m0.000s
ま、そりゃ速いですわな……
科学的表記で出力すると速いけど 整数表記しようとするとfib(10億)で2分ぐらい
文字列化でかなり時間を食ってます
じゃ、多倍長使って一般項の公式で算出したケースを晒します
スレチと知りつつ C++ で boost/multiprecision バックエンドは gmp
https://wandbox.org/permlink/QqxaauQeHTjJRrYX
# fib(0) .. fib(1000) + fib(10億)
real 0m0.004s
user 0m0.004s
sys 0m0.000s
ま、そりゃ速いですわな……
科学的表記で出力すると速いけど 整数表記しようとするとfib(10億)で2分ぐらい
文字列化でかなり時間を食ってます
854デフォルトの名無しさん (スップ Sd8a-+oCX)
2018/08/11(土) 10:40:58.88ID:y6G1YdWMd 正確に全桁計算してその時間?
じゃないよね?
じゃないよね?
855デフォルトの名無しさん (スップ Sd8a-+oCX)
2018/08/11(土) 10:44:26.74ID:y6G1YdWMd 有効精度何桁で計算した場合の時間?
856デフォルトの名無しさん (スップ Sd8a-+oCX)
2018/08/11(土) 10:50:42.30ID:y6G1YdWMd 有効数字が少ない時は>>821の式の方が速いよ
>>821 は桁数が非常に大きくなるとどうなるか、よくわからないんですよ、ちょっと試してみますね
858デフォルトの名無しさん (スップ Sd8a-+oCX)
2018/08/11(土) 11:02:48.70ID:y6G1YdWMd 2個の定数は求めたい有効精度+αの精度で求めておけばOK
859デフォルトの名無しさん (スップ Sd8a-+oCX)
2018/08/11(土) 11:04:23.75ID:y6G1YdWMd >>853の式の、
nに依存せずに計算できる所だけ先に計算しただけなので
nに依存せずに計算できる所だけ先に計算しただけなので
860デフォルトの名無しさん (スップ Sd8a-+oCX)
2018/08/11(土) 11:11:54.17ID:y6G1YdWMd expの計算の内部ではlog 2を使うし
2進10進変換にはlog_10 (2)を使うので
doubleより高精度で求めるなら
この辺も先に計算しておくことになるでしょう
>>850ははじめから10進での計算なので
10進文字列に変換するのは一瞬
2進10進変換にはlog_10 (2)を使うので
doubleより高精度で求めるなら
この辺も先に計算しておくことになるでしょう
>>850ははじめから10進での計算なので
10進文字列に変換するのは一瞬
861デフォルトの名無しさん (スップ Sd8a-+oCX)
2018/08/11(土) 11:13:07.14ID:y6G1YdWMd 書き忘れましたが
>>850は10進数で全桁正確に求めた場合の時間です
>>850は10進数で全桁正確に求めた場合の時間です
862デフォルトの名無しさん (ワッチョイ 9f2d-IVAT)
2018/08/11(土) 11:19:04.68ID:ONHM6Q8h0863デフォルトの名無しさん (スップ Sd8a-+oCX)
2018/08/11(土) 11:22:04.43ID:y6G1YdWMd864デフォルトの名無しさん (スップ Sd8a-+oCX)
2018/08/11(土) 11:25:21.63ID:y6G1YdWMd f(10億)の下位100桁はいくつになります?
私は今出先で私の結果は夜貼ります
私は今出先で私の結果は夜貼ります
865デフォルトの名無しさん (ワッチョイ 9f2d-IVAT)
2018/08/11(土) 11:29:35.08ID:ONHM6Q8h0 >>863
https://www.boost.org/doc/libs/1_68_0/libs/multiprecision/doc/html/boost_multiprecision/tut/floats/gmp_float.html
gmp_floatが number<gmp_float<0>> の typedef なので
"variable precision by setting the template argument to zero"で無限精度指定になってると理解してます
正確に出力させると桁が膨大で検証しにくくてしょうがないな…… これ
https://www.boost.org/doc/libs/1_68_0/libs/multiprecision/doc/html/boost_multiprecision/tut/floats/gmp_float.html
gmp_floatが number<gmp_float<0>> の typedef なので
"variable precision by setting the template argument to zero"で無限精度指定になってると理解してます
正確に出力させると桁が膨大で検証しにくくてしょうがないな…… これ
866デフォルトの名無しさん (ワッチョイ de80-oNxq)
2018/08/11(土) 11:39:50.69ID:17qcRus/0 とりあえずかわいそうなぐらい頭悪いヤツしかいないのは分かった
一旦、多倍長演算向けに3つの方法を評価する
ちなみにgmpの関数にフィボナッチの関数がついてる
きっとこの速度にすら届かないと考えられる(まだ動かしてない)
↓多倍長演算使ってない3つの方法の簡単なコードがコレ
https://ideone.com/vhpLPV
※ オマケでアホが書いたコード(>>851)も入ってる
※ オレの適切なありがたい注釈がついてる
1.ひたすら足し算
2.一般項
多倍長演算をするまえに適切な精度を設定しないといけない
どれぐらいの精度にすればいいかがまだ未解決 ※ とりあえず2回計算することでいけるような気がしないでもない
3.再帰階乗演算
https://www.ics.uci.edu/~eppstein/161/960109.html
探した中でコイツが一番いい感じがする
> This is a recursive algorithm, so as usual we get a recurrence relation defining time,
> just by writing down the time spent in a call to matpow (O(1)) plus the time in each recursive call
> (only one recursive call, with argument n/2). So the recurrence is
> time(n) = O(1) + time(n / 2)
一旦、多倍長演算向けに3つの方法を評価する
ちなみにgmpの関数にフィボナッチの関数がついてる
きっとこの速度にすら届かないと考えられる(まだ動かしてない)
↓多倍長演算使ってない3つの方法の簡単なコードがコレ
https://ideone.com/vhpLPV
※ オマケでアホが書いたコード(>>851)も入ってる
※ オレの適切なありがたい注釈がついてる
1.ひたすら足し算
2.一般項
多倍長演算をするまえに適切な精度を設定しないといけない
どれぐらいの精度にすればいいかがまだ未解決 ※ とりあえず2回計算することでいけるような気がしないでもない
3.再帰階乗演算
https://www.ics.uci.edu/~eppstein/161/960109.html
探した中でコイツが一番いい感じがする
> This is a recursive algorithm, so as usual we get a recurrence relation defining time,
> just by writing down the time spent in a call to matpow (O(1)) plus the time in each recursive call
> (only one recursive call, with argument n/2). So the recurrence is
> time(n) = O(1) + time(n / 2)
867デフォルトの名無しさん (スップ Sd8a-+oCX)
2018/08/11(土) 11:48:25.12ID:y6G1YdWMd868デフォルトの名無しさん (スップ Sd8a-+oCX)
2018/08/11(土) 11:52:02.92ID:y6G1YdWMd >>865
√5を無限精度で求めるなんて不可能ですよ
√5を無限精度で求めるなんて不可能ですよ
869デフォルトの名無しさん (スップ Sd8a-+oCX)
2018/08/11(土) 11:55:08.80ID:y6G1YdWMd870デフォルトの名無しさん (スップ Sd8a-+oCX)
2018/08/11(土) 11:58:25.35ID:y6G1YdWMd871デフォルトの名無しさん (ワッチョイ de80-oNxq)
2018/08/11(土) 12:00:16.70ID:17qcRus/0 ↓アルゴリズム5でオレのサンプルではちゃんと動いてるからな
https://ideone.com/vhpLPV
↓オマエのは動かしても適切な結果にならない
https://ideone.com/vhpLPV
オマエのはお話にならないぐらいペケ
↓ペケの理由もちゃんとコメントに書いてある
https://ideone.com/vhpLPV
https://ideone.com/vhpLPV
↓オマエのは動かしても適切な結果にならない
https://ideone.com/vhpLPV
オマエのはお話にならないぐらいペケ
↓ペケの理由もちゃんとコメントに書いてある
https://ideone.com/vhpLPV
872デフォルトの名無しさん (スップ Sd8a-+oCX)
2018/08/11(土) 12:04:23.64ID:y6G1YdWMd 劣化コピーしたらそりゃ正しく動かないよ
nは64bitにしないと
nは64bitにしないと
873デフォルトの名無しさん (ワッチョイ 9f2d-IVAT)
2018/08/11(土) 12:06:06.40ID:ONHM6Q8h0874デフォルトの名無しさん (ワッチョイ de80-oNxq)
2018/08/11(土) 12:06:47.07ID:17qcRus/0 オマエは基本的にオツムに問題がある
病院へいったほうがいい
病院へいったほうがいい
875デフォルトの名無しさん (スップ Sd8a-+oCX)
2018/08/11(土) 12:07:58.68ID:y6G1YdWMd nが32bitなら0x80000000にしないと
多倍長で動かすためのテストコードだから
桁数が小さい時の計算回数は全く無視
ループが進んでからやっと演算がはじまる
多倍長で動かすためのテストコードだから
桁数が小さい時の計算回数は全く無視
ループが進んでからやっと演算がはじまる
876デフォルトの名無しさん (ワッチョイ de80-oNxq)
2018/08/11(土) 12:09:49.79ID:17qcRus/0 64回しかループしてない
Σ n
n→64
はいくつになる
Σ n
n→64
はいくつになる
877デフォルトの名無しさん (スップ Sd8a-+oCX)
2018/08/11(土) 12:14:07.21ID:y6G1YdWMd n <<= 1;
って書いてあげた方がよかったかな
どうせコンパイラが足し算に直すだろうし
って書いてあげた方がよかったかな
どうせコンパイラが足し算に直すだろうし
878デフォルトの名無しさん (ワッチョイ de80-oNxq)
2018/08/11(土) 16:36:24.18ID:17qcRus/0 1.と3.は簡単にできた
https://ideone.com/cmAQzO
gmplibのフィボナッチは n=10,000,000 を
0.7秒ぐらいで処理できる
オレが作ったのは4秒ぐらいかかる
m,10000000,4.008508,3.989280
g,10000000,0.724954,0.717120
全然かなわない
少しやってみて面倒そうだから後回しにしてた一般項やってみるか
https://ideone.com/cmAQzO
gmplibのフィボナッチは n=10,000,000 を
0.7秒ぐらいで処理できる
オレが作ったのは4秒ぐらいかかる
m,10000000,4.008508,3.989280
g,10000000,0.724954,0.717120
全然かなわない
少しやってみて面倒そうだから後回しにしてた一般項やってみるか
879デフォルトの名無しさん (スップ Sd8a-+oCX)
2018/08/11(土) 18:32:01.22ID:y6G1YdWMd880デフォルトの名無しさん (スップ Sd8a-+oCX)
2018/08/11(土) 18:34:26.69ID:y6G1YdWMd ループの最後の64回目は
aだけを計算すればいいので
かなり省略出来ます
aだけを計算すればいいので
かなり省略出来ます
881デフォルトの名無しさん (ワッチョイ de80-oNxq)
2018/08/11(土) 19:41:53.58ID:17qcRus/0 https://ideone.com/2by35t
精度評価用のログ取得処理
32bit版GMPの仮数部は初期値が64bitで32bitずつ増えていく模様
ちなみに64bit精度で一瞬で求まるフィボナッチ数のサイズ(bit)予測値はほぼ誤差なし
※ 9999件まで確認したが誤差は発生してない
※ 保険で、1dword(32bit - 最小単位) 分、余分に足しとけば、この予測値で間違いがおきることはまずないと考えられる
フィボナッチ数のサイズ(bit)予測値から必要な精度が予測できる
※ 9999件まで確認したが
※ フィボナッチ数のサイズ(bit)の1dword(32bit - 最小単位) 分より大きい誤差は発生してない
↓コレがその結果
http://fast-uploader.com/file/7089539563485/
http://fast-uploader.com/file/7089539604357/
数学的に証明したわけではないが、きっとコレで間違いなくいける
つまり予測値に64bit足しとけば間違いがおきることはない
精度評価用のログ取得処理
32bit版GMPの仮数部は初期値が64bitで32bitずつ増えていく模様
ちなみに64bit精度で一瞬で求まるフィボナッチ数のサイズ(bit)予測値はほぼ誤差なし
※ 9999件まで確認したが誤差は発生してない
※ 保険で、1dword(32bit - 最小単位) 分、余分に足しとけば、この予測値で間違いがおきることはまずないと考えられる
フィボナッチ数のサイズ(bit)予測値から必要な精度が予測できる
※ 9999件まで確認したが
※ フィボナッチ数のサイズ(bit)の1dword(32bit - 最小単位) 分より大きい誤差は発生してない
↓コレがその結果
http://fast-uploader.com/file/7089539563485/
http://fast-uploader.com/file/7089539604357/
数学的に証明したわけではないが、きっとコレで間違いなくいける
つまり予測値に64bit足しとけば間違いがおきることはない
882デフォルトの名無しさん (ワッチョイ de80-oNxq)
2018/08/11(土) 19:44:24.09ID:17qcRus/0 で、>>881の結果に基づいて
一般項で処理するコードを書いた
https://ideone.com/QKTrLi
一般項で処理
やってみたが
一般項で処理なんかするとともかく遅い
6,942,482 bitsの一般項の計算で
お話にならないぐらいものすごい時間がかかる
calculation 6942482bits
f,10000000,35.082393,34.855636
g,10000000,0.722054,0.720584
つまり、結論としてフィボナッチ数を求めるなら
GMPに用意されてる関数を使うのが一番
再帰階乗演算使う方がはるかにマシ
一般項で求めるのはウンコ
一般項で処理するコードを書いた
https://ideone.com/QKTrLi
一般項で処理
やってみたが
一般項で処理なんかするとともかく遅い
6,942,482 bitsの一般項の計算で
お話にならないぐらいものすごい時間がかかる
calculation 6942482bits
f,10000000,35.082393,34.855636
g,10000000,0.722054,0.720584
つまり、結論としてフィボナッチ数を求めるなら
GMPに用意されてる関数を使うのが一番
再帰階乗演算使う方がはるかにマシ
一般項で求めるのはウンコ
884デフォルトの名無しさん (ワッチョイ 0b50-2km2)
2018/08/11(土) 21:43:12.30ID:N9ICkOCi0886デフォルトの名無しさん (ワッチョイ 0b50-2km2)
2018/08/11(土) 21:50:41.32ID:N9ICkOCi0 ローカル環境では動いてますが、
>>852に書いた通りideoneだと動きません
>>852に書いた通りideoneだと動きません
887デフォルトの名無しさん (ワッチョイ 4a8d-2km2)
2018/08/11(土) 21:58:41.55ID:VKOHvb3S0 floatとdoubleの値の範囲を教えてください。
-0.000034 < float < 0.000034
-0.00000000016 < long < 0.0000000016
みたいな感じで教えてください><
-0.000034 < float < 0.000034
-0.00000000016 < long < 0.0000000016
みたいな感じで教えてください><
888デフォルトの名無しさん (ワッチョイ 5f81-2km2)
2018/08/11(土) 22:22:37.58ID:v96Fcglg0 >>886
私も手元で確かめました、確かにこれは爆速ですね…私の古いPCでもf(1000万)までならば一瞬で答えが出ます。
私も手元で確かめました、確かにこれは爆速ですね…私の古いPCでもf(1000万)までならば一瞬で答えが出ます。
890デフォルトの名無しさん (ワッチョイ 6fc3-5rxo)
2018/08/11(土) 22:26:14.75ID:UyVMPuF50 C言語でゲームがアクションゲームが作りたくてプログラミングはじめた
実際にプログラミングって楽しいと感じてる
でも入門書通りソートアルゴリズムを勉強してて、基本交換法やら基本選択法は楽にフローチャートもコードも書けたのに、そのあとにやった クイックソートとか単純挿入法では面白いぐらい苦戦した(どっちももうできるようになったけど)
これって、俺のアルゴリズムを考える能力が乏しいってことなのかな
それともはじめはみんなこんなもの?
実際にプログラミングって楽しいと感じてる
でも入門書通りソートアルゴリズムを勉強してて、基本交換法やら基本選択法は楽にフローチャートもコードも書けたのに、そのあとにやった クイックソートとか単純挿入法では面白いぐらい苦戦した(どっちももうできるようになったけど)
これって、俺のアルゴリズムを考える能力が乏しいってことなのかな
それともはじめはみんなこんなもの?
891デフォルトの名無しさん (ワッチョイ 6fc3-5rxo)
2018/08/11(土) 22:26:40.35ID:UyVMPuF50 ×ゲームがアクションが
◯アクションゲームが
◯アクションゲームが
892デフォルトの名無しさん (ワッチョイ 4a12-oNxq)
2018/08/11(土) 22:35:15.61ID:d91dd04/0 再帰とポインタで躓くと昔から伝わっている
特に再帰は禅でもやって悟りを得ないと理解できない
特に再帰は禅でもやって悟りを得ないと理解できない
893さまよえる蟻人間 ◆T6xkBnTXz7B0 (スププ Sdea-cF9D)
2018/08/11(土) 22:35:57.56ID:/IS35TFAd だれでも最初は赤ちゃん歩き。私も最初はじゃんけんのプログラミングが全くできなかった。
894デフォルトの名無しさん (ワッチョイ 0b50-2km2)
2018/08/11(土) 22:42:41.92ID:N9ICkOCi0895デフォルトの名無しさん (ワッチョイ 0b50-2km2)
2018/08/11(土) 23:13:57.75ID:N9ICkOCi0 n log nより遅いように見えるのは
サイズが大きいとキャッシュから外れるため
フーリエ変換はメモリのランダムアクセスが頻発するので
キャッシュに入るかどうかで大きく時間が変わる
適当に並び変えながら変換することで
キャッシュヒット率を上げたり
メインメモリに収まりきらない巨大サイズをHDDを使いながら変換することも出来るのだが、
今回はシンプルさ重視の為見送り
世の中にある高速FFTライブラリに差し替えれば
もっと高速化する
サイズが大きいとキャッシュから外れるため
フーリエ変換はメモリのランダムアクセスが頻発するので
キャッシュに入るかどうかで大きく時間が変わる
適当に並び変えながら変換することで
キャッシュヒット率を上げたり
メインメモリに収まりきらない巨大サイズをHDDを使いながら変換することも出来るのだが、
今回はシンプルさ重視の為見送り
世の中にある高速FFTライブラリに差し替えれば
もっと高速化する
896デフォルトの名無しさん (ワッチョイ 0b50-2km2)
2018/08/11(土) 23:25:51.63ID:N9ICkOCi0 >>887
環境依存
float, double がそれぞれIEEE754のbinary32とbinary64準拠の場合はおおよそ
-3.4028234663852885981*10^38 ≦ float ≦ 3.4028234663852885981*10^38
-1.7976931348623157081*10^308 ≦ double ≦ 1.7976931348623157081*10^308
正確には以下の範囲
float : ±(2^24-1)*2^104
double : ±(2^53-1)*2^971
これに追加して±∞, NaN などがある
組み込みなどではdoubleも32bitであることも多い
環境依存
float, double がそれぞれIEEE754のbinary32とbinary64準拠の場合はおおよそ
-3.4028234663852885981*10^38 ≦ float ≦ 3.4028234663852885981*10^38
-1.7976931348623157081*10^308 ≦ double ≦ 1.7976931348623157081*10^308
正確には以下の範囲
float : ±(2^24-1)*2^104
double : ±(2^53-1)*2^971
これに追加して±∞, NaN などがある
組み込みなどではdoubleも32bitであることも多い
897デフォルトの名無しさん (ワッチョイ 0b50-2km2)
2018/08/11(土) 23:33:36.42ID:N9ICkOCi0 C言語スレだから ^ は排他的論理和の意味で使うべきでしたかね
-340282346638528859811704183484516925440 ≦ binary32 ≦ 340282346638528859811704183484516925440
-1797693134862315708145274237317043567980705675258449965989174768
0315726078002853876058955863276687817154045895351438246423432132
6889464182768467546703537516986049910576551282076245490090389328
9440758685084551339423045832369032229481658085593321233482747978
26204144723168738177180919299881250404026184124858368
≦ binary64 ≦
1797693134862315708145274237317043567980705675258449965989174768
0315726078002853876058955863276687817154045895351438246423432132
6889464182768467546703537516986049910576551282076245490090389328
9440758685084551339423045832369032229481658085593321233482747978
26204144723168738177180919299881250404026184124858368
-340282346638528859811704183484516925440 ≦ binary32 ≦ 340282346638528859811704183484516925440
-1797693134862315708145274237317043567980705675258449965989174768
0315726078002853876058955863276687817154045895351438246423432132
6889464182768467546703537516986049910576551282076245490090389328
9440758685084551339423045832369032229481658085593321233482747978
26204144723168738177180919299881250404026184124858368
≦ binary64 ≦
1797693134862315708145274237317043567980705675258449965989174768
0315726078002853876058955863276687817154045895351438246423432132
6889464182768467546703537516986049910576551282076245490090389328
9440758685084551339423045832369032229481658085593321233482747978
26204144723168738177180919299881250404026184124858368
898デフォルトの名無しさん (ワッチョイ 0b50-2km2)
2018/08/11(土) 23:41:42.36ID:N9ICkOCi0 >>888
単純なバグでした
size_t が64bit前提の部分があったのと、
非常に恥ずかしいですが以下のような動作不定なコードがありました
a->data[i++] = b->data[i] + carry;
私のローカル環境だとたまたま動いていたようです
intが16bitだとまだヤバそうですが、
16bit環境で動かすことはないと思うので気にしないことにします
単純なバグでした
size_t が64bit前提の部分があったのと、
非常に恥ずかしいですが以下のような動作不定なコードがありました
a->data[i++] = b->data[i] + carry;
私のローカル環境だとたまたま動いていたようです
intが16bitだとまだヤバそうですが、
16bit環境で動かすことはないと思うので気にしないことにします
899デフォルトの名無しさん (ワッチョイ 4a8d-2km2)
2018/08/11(土) 23:47:51.76ID:VKOHvb3S0900デフォルトの名無しさん (ワッチョイ 0b50-2km2)
2018/08/11(土) 23:56:09.61ID:N9ICkOCi0901デフォルトの名無しさん (ワッチョイ 5f81-2km2)
2018/08/12(日) 00:23:34.17ID:BxiB5wa+0 >>898
ideoneだと100万ちょっと下でRuntimeErrorで途中でとまってるぽいね
ideoneだと100万ちょっと下でRuntimeErrorで途中でとまってるぽいね
902デフォルトの名無しさん (アウアウエー Sac2-+AzL)
2018/08/12(日) 07:44:42.21ID:P7wTPSJQa 蛇とJSとアセンブラ少しかじったんだけどCの効率的な勉強法ある?
主に蛇のチューニングと、これから勉強する予定なんだけど組み込み用マイコンのプログラムを書くために使う
小型のドローンもどきにのせたマイコンに、学習済みパターンをのせて動作制御したい
主に蛇のチューニングと、これから勉強する予定なんだけど組み込み用マイコンのプログラムを書くために使う
小型のドローンもどきにのせたマイコンに、学習済みパターンをのせて動作制御したい
レス数が900を超えています。1000を超えると表示できなくなるよ。
ニュース
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★4 [七波羅探題★]
- 【地震速報】青森県で震度6強 沿岸部に津波警報 ★6 [ぐれ★]
- 「日の丸にバツ印」掲げた大学生 あいまいな国旗損壊罪に「怖い」 The Mainichi [少考さん★]
- 【テレビ】25年ぶり復活「炎のチャレンジャー」南原清隆&菊池風磨がMC 懐かし「電流イライラ棒」も [湛然★]
- 【サッカー】驚異の42得点0失点 中国を怒涛の5連勝に導いた日本人指揮官がまさかの退任か。協会対応に国民激怒 [征夷大将軍★]
- 【音楽】BARBEE BOYS・KONTAが事故で四肢麻痺を公表、新体制で活動は継続 [少考さん★]
- ( ・᷄ὢ・᷅ )あ?
- 背中が毛むくじゃらのやつなんなの?
- こんぺこ!こんぺこ!こんぺこ!🐰🏡
- ブタをぶったたく
- こんな自転車乗ってたやつがいたら?
- 被災者のためにエロ画像貼ってけ
