探検
C++相談室 part152
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2020/07/12(日) 13:42:20.13ID:TX1mpKr6279デフォルトの名無しさん
2020/09/11(金) 01:08:43.17ID:hb2JlHSF >>278
しらそん
桁の十分不十分は応用にもよるし
足りないとわかったらRationalの方を多数桁対応させるは
とにかくRationalは見かけをdouble型と同様に扱えるように仕上げ鯛、
なぜなら真に走らせたいアルゴリズムはdoubleをtypedefして作ってあって、
それをRationalに差し替えるだけ!と思ってたら
単体テストが10億行ぐらい浮動小数点で書いてあったので…
しらそん
桁の十分不十分は応用にもよるし
足りないとわかったらRationalの方を多数桁対応させるは
とにかくRationalは見かけをdouble型と同様に扱えるように仕上げ鯛、
なぜなら真に走らせたいアルゴリズムはdoubleをtypedefして作ってあって、
それをRationalに差し替えるだけ!と思ってたら
単体テストが10億行ぐらい浮動小数点で書いてあったので…
280デフォルトの名無しさん
2020/09/11(金) 01:27:41.74ID:ajBE7peV281デフォルトの名無しさん
2020/09/11(金) 01:52:30.29ID:tAPrmVM5 文字列受け取るコンストラクタ書くだけだろ
282デフォルトの名無しさん
2020/09/11(金) 03:35:25.76ID:iBiKDQ69 char配列に変換して8バイト読み書きするだけのこと
文字列に変換することは忘れろ
文字列に変換することは忘れろ
283デフォルトの名無しさん
2020/09/11(金) 12:52:59.43ID:WJYUzgW7 そもそも0と0.0を区別する方法がないのにどこまで意味のある事なのか
284デフォルトの名無しさん
2020/09/11(金) 15:59:42.05ID:Cxw4gZ+X > (必ずいちいちRational x = Rational(11, 100);と書かなければならないことはユーザー(≒漏れ自身)に強制したくない
無理だろ
Rational x = 0.1;
こんなの、どうすんだよ?
double型の0.1は1/10じゃねえぞ
無理だろ
Rational x = 0.1;
こんなの、どうすんだよ?
double型の0.1は1/10じゃねえぞ
285デフォルトの名無しさん
2020/09/11(金) 16:00:39.94ID:Cxw4gZ+X denが必ず10のべき、みたいなことにして
誤差が最小になるように頑張るならともかく
誤差が最小になるように頑張るならともかく
286デフォルトの名無しさん
2020/09/11(金) 16:17:57.96ID:FpD9K4HS >>272
Rational x = "0.11"; を許せばいい
Rational x = "0.11"; を許せばいい
287デフォルトの名無しさん
2020/09/11(金) 16:29:19.36ID:6r5prnWG >>279
仮にテストコードに 0.333333333333333 って書いてあったとしても
それは 0.3333333333333329818 のことだから、
0.333333333333333として受け取ってしまうと逆にテストに失敗するのでは?
仮にテストコードに 0.333333333333333 って書いてあったとしても
それは 0.3333333333333329818 のことだから、
0.333333333333333として受け取ってしまうと逆にテストに失敗するのでは?
288デフォルトの名無しさん
2020/09/11(金) 16:36:45.19ID:G2VX17rJ 10億行ぐらい既存テストコードがあるとのことなので文字列とか全面書き換えになる案はNGなんでしょう
でもいい案はなさげ
一旦浮動小数になったら元のリテラルの復元はできないだろうな
でもいい案はなさげ
一旦浮動小数になったら元のリテラルの復元はできないだろうな
289デフォルトの名無しさん
2020/09/11(金) 16:39:43.52ID:su+TWEMf >文字列とか全面書き換え
Rational にする書き換えはOKなんだろ
Rational にする書き換えはOKなんだろ
290デフォルトの名無しさん
2020/09/11(金) 16:43:40.92ID:G2VX17rJ そりゃクラスの差し替えは局所的な置き換えで済むんじゃないの
浮動小数のリテラルを全部文字列に置き換えることに比べたら楽でしょ
まぁ本人が答えるべきだが状況はなんとなく推測できる
浮動小数のリテラルを全部文字列に置き換えることに比べたら楽でしょ
まぁ本人が答えるべきだが状況はなんとなく推測できる
291デフォルトの名無しさん
2020/09/11(金) 20:04:14.01ID:ua52u3Jr そのくらい正規表現で置換すればいいだろ。
だいたい10億行のテストコードが仮に本当なら100%手書きじゃないから一つずつ確認しながら置換するなんてアホなことはしない。
有理数クラスなんて普通は枯れたライブラリ拾って来るけどな
だいたい10億行のテストコードが仮に本当なら100%手書きじゃないから一つずつ確認しながら置換するなんてアホなことはしない。
有理数クラスなんて普通は枯れたライブラリ拾って来るけどな
292デフォルトの名無しさん
2020/09/11(金) 20:18:44.50ID:G2VX17rJ だからさ、そこは本人の希望なんだからあれこれ言ってもしかたないじゃん
正規表現で機械的に置き換えたらまずいものもあるかもしれないし
浮動小数と有理数で切り替えたいって言ってるからそのメンテコストもあるだろ
正規表現で機械的に置き換えたらまずいものもあるかもしれないし
浮動小数と有理数で切り替えたいって言ってるからそのメンテコストもあるだろ
293デフォルトの名無しさん
2020/09/11(金) 21:28:10.16ID:opulvzCM ユーザー定義リテラルとか使ってboost::rationalでも生成したら?
やったことないからできるか知らんが。
やったことないからできるか知らんが。
294デフォルトの名無しさん
2020/09/11(金) 21:35:23.73ID:em6XQ5sn 何にせよdoubleになった時点でリテラル表記の情報は失われるんだから、何がしかの書き換えをするしかない
それがイヤだ絶対やらんと言うなら、じゃあ不可能だよという答えにしかならない
それがイヤだ絶対やらんと言うなら、じゃあ不可能だよという答えにしかならない
295デフォルトの名無しさん
2020/09/11(金) 21:51:53.86ID:aT3N5bZo プリプロセッサを書けばどうだろう
296デフォルトの名無しさん
2020/09/11(金) 22:53:08.79ID:3mrNom4D Rational に double の数値が直代入されてるところだけ文字列代入にするための
プリプロセッサ描けば良い話
プリプロセッサ描けば良い話
297デフォルトの名無しさん
2020/09/12(土) 05:53:05.89ID:2ljmp3qW 結論から言うと、
IEEE 754の値x → 10進数文字列 s→ IEEE 754の値x'
という変換を行った場合、x == x'となるかどうかはx次第であって一般に保証されないが、
10進数文字列s → IEEE 754の値x → 10進数文字列s'
という変換は、sが非正規化数だったりIEEE 754の仮数部で表現可能な桁数を超えない限り -- (1)
s == s'を保証可能
なぜなら、(1)の条件を満たすsとそのIEEE 754への変換結果xの食い違う条件は
sを2進数に変換したとき循環小数になる場合に限られるが(もとの10進数のsはもちろん循環小数ではない
この食い違いは±DBL_MINを超えないから以下略
(結局x→s'変換はalmost_equal<T>()的な処理が必要にはなるが、適切にやれば
sの整数部の文字列化 ==> x -= (xの整数部) ==> x *= 10、
の反復を何時やめればよいか確定する
IEEE 754の値x → 10進数文字列 s→ IEEE 754の値x'
という変換を行った場合、x == x'となるかどうかはx次第であって一般に保証されないが、
10進数文字列s → IEEE 754の値x → 10進数文字列s'
という変換は、sが非正規化数だったりIEEE 754の仮数部で表現可能な桁数を超えない限り -- (1)
s == s'を保証可能
なぜなら、(1)の条件を満たすsとそのIEEE 754への変換結果xの食い違う条件は
sを2進数に変換したとき循環小数になる場合に限られるが(もとの10進数のsはもちろん循環小数ではない
この食い違いは±DBL_MINを超えないから以下略
(結局x→s'変換はalmost_equal<T>()的な処理が必要にはなるが、適切にやれば
sの整数部の文字列化 ==> x -= (xの整数部) ==> x *= 10、
の反復を何時やめればよいか確定する
298デフォルトの名無しさん
2020/09/12(土) 05:55:29.22ID:2ljmp3qW299デフォルトの名無しさん
2020/09/12(土) 08:39:01.67ID:U5yMllJ4 sagemathで
a=0.11
QQ(a)
とすると
11/100
が得られる
aの実体はMPFRのオブジェクト
まーsagemathのソースでも見とけば
a=0.11
QQ(a)
とすると
11/100
が得られる
aの実体はMPFRのオブジェクト
まーsagemathのソースでも見とけば
300デフォルトの名無しさん
2020/09/12(土) 15:38:22.68ID:cDX1Q2rT >>297
的外れ
的外れ
301デフォルトの名無しさん
2020/09/12(土) 15:47:40.14ID:JdE/Bv85 >>297
その前にリテラル表現→double値(お前が言うところのIEEE754の値)
という変換が入って、それが不可逆だから書き換えなしじゃ無理だっつってんだよ
Hoge(0.0)とHoge(0.00)に表現に応じた別の処理させるのはC++の範囲では不可能だ
その前にリテラル表現→double値(お前が言うところのIEEE754の値)
という変換が入って、それが不可逆だから書き換えなしじゃ無理だっつってんだよ
Hoge(0.0)とHoge(0.00)に表現に応じた別の処理させるのはC++の範囲では不可能だ
302デフォルトの名無しさん
2020/09/12(土) 15:50:40.29ID:cDX1Q2rT プリプロセッサなら可能
Cの仕様
Cの仕様
303デフォルトの名無しさん
2020/09/12(土) 15:54:45.19ID:JdE/Bv85 ああ、#で文字列化できるからこの場合はできるのか忘れてた
まあ対象の浮動小数を全部マクロで括らないといけないからどっちみち書き換えは発生するけどな
まあ対象の浮動小数を全部マクロで括らないといけないからどっちみち書き換えは発生するけどな
304デフォルトの名無しさん
2020/09/12(土) 15:56:41.81ID:cDX1Q2rT おまえプリプロセッサが何か判ってないだろ
305デフォルトの名無しさん
2020/09/12(土) 15:59:56.68ID:JdE/Bv85 ん?シンボルを文字列化する#演算子はプリプロセッサディレクティブの一つだぞ
何か間違ってるか?
何か間違ってるか?
306デフォルトの名無しさん
2020/09/12(土) 16:08:00.10ID:idwadC/M 問題はそこじゃない
307デフォルトの名無しさん
2020/09/12(土) 16:17:43.12ID:JdE/Bv85 絡んでくるだけで具体的な問題を指摘できないカスは置いといて
プリプロセッサフェーズの後で0.0と0.00を区別する方法はないから279君の望みは叶わないでFA
プリプロでもdouble x = 0.00;とかを自動で書き換えるの無理でしょ
プリプロセッサフェーズの後で0.0と0.00を区別する方法はないから279君の望みは叶わないでFA
プリプロでもdouble x = 0.00;とかを自動で書き換えるの無理でしょ
308デフォルトの名無しさん
2020/09/12(土) 16:19:33.34ID:idwadC/M プリプロセッサを書けと言っている
309デフォルトの名無しさん
2020/09/12(土) 16:28:52.93ID:erdZI+Jx >>299
有理数の分母が10の冪という前提ならある程度の精度で出来そうだな。
有理数の分母が10の冪という前提ならある程度の精度で出来そうだな。
310デフォルトの名無しさん
2020/09/12(土) 17:27:31.95ID:JdE/Bv85 分母仮定せずに普通にディオファントス近似した方が誤差小さくなると思うんだけど
311デフォルトの名無しさん
2020/09/12(土) 17:57:13.06ID:erdZI+Jx 10進リテラルで渡す前提なら分母が10の冪になってしまったら逆に誤差が大きいことになると思うが。
#約分とかは別として。
まぁ、1.0/3.0みたいなものも渡せるようにということなら確かにそうかも。
#約分とかは別として。
まぁ、1.0/3.0みたいなものも渡せるようにということなら確かにそうかも。
312デフォルトの名無しさん
2020/09/12(土) 20:28:37.72ID:2ljmp3qW とりあえずここまではできた;;
x=0.1: rt=1/10
x=0.11: rt=11/100
x=0.111: rt=111/1000
x=0.1111: rt=1111/10000
x=0.9: rt=9/10
x=0.99: rt=99/100
x=0.999: rt=999/1000
x=0.9999: rt=9999/10000
x=0.33333: rt=33333/100000
x=123.34567: rt=1233456699999999/10000000000000 // NG
x=123.345678: rt=123345678/1000000
x=123.3456789: rt=1233456788999999/10000000000000 // NG
x=12.34567: rt=1234567/100000
x=12: rt=12/1
x=123E-5: rt=123/100000
x=0.1: rt=1/10
x=0.11: rt=11/100
x=0.111: rt=111/1000
x=0.1111: rt=1111/10000
x=0.9: rt=9/10
x=0.99: rt=99/100
x=0.999: rt=999/1000
x=0.9999: rt=9999/10000
x=0.33333: rt=33333/100000
x=123.34567: rt=1233456699999999/10000000000000 // NG
x=123.345678: rt=123345678/1000000
x=123.3456789: rt=1233456788999999/10000000000000 // NG
x=12.34567: rt=1234567/100000
x=12: rt=12/1
x=123E-5: rt=123/100000
313デフォルトの名無しさん
2020/09/12(土) 20:35:15.16ID:2ljmp3qW わかったことは、
10進数文字列s → IEEE 754の値x → 10進数文字列s'
において、s→xのところで仮数部最小桁で丸めがおきたのかどうかの情報が無いと
xからsの復元が難しいケースがあるというこっちゃorz
コンパイラならs→xをやるのは自分自身なので、x→s'を行うライブラリと手を握ってうまいことやれる可能性があるが
xを与えられるだけのユーザープログラムではこれは対処が難しい
Ad-hocに.999999 = 1とみなす系のAd-hocな処置が必要かも試練、
10進数文字列s → IEEE 754の値x → 10進数文字列s'
において、s→xのところで仮数部最小桁で丸めがおきたのかどうかの情報が無いと
xからsの復元が難しいケースがあるというこっちゃorz
コンパイラならs→xをやるのは自分自身なので、x→s'を行うライブラリと手を握ってうまいことやれる可能性があるが
xを与えられるだけのユーザープログラムではこれは対処が難しい
Ad-hocに.999999 = 1とみなす系のAd-hocな処置が必要かも試練、
314デフォルトの名無しさん
2020/09/12(土) 20:45:44.57ID:JdE/Bv85 だからさ
例えばそれでrt=1233456699999999/10000000000000になったとして
どうやって元の表現が123.34567だったって判断するのさ
本当に123.345699999999って書かれてた場合と区別できるわけないんだけどどうするの?
123.34567を123.345699999999に間違えるのはダメだけど逆は許されるの?どうして?どういう仮定置いてるの?
その辺を何一つハッキリさせないまま勝手にやられても
何がしたいのか全くわからない
例えばそれでrt=1233456699999999/10000000000000になったとして
どうやって元の表現が123.34567だったって判断するのさ
本当に123.345699999999って書かれてた場合と区別できるわけないんだけどどうするの?
123.34567を123.345699999999に間違えるのはダメだけど逆は許されるの?どうして?どういう仮定置いてるの?
その辺を何一つハッキリさせないまま勝手にやられても
何がしたいのか全くわからない
315デフォルトの名無しさん
2020/09/12(土) 20:52:26.12ID:EJqlmNG1 まぁそんな追い込まんでも
自分で手を動かしてダメっぽいことい気づいたのは立派だよ
自分で手を動かしてダメっぽいことい気づいたのは立派だよ
316デフォルトの名無しさん
2020/09/12(土) 20:53:34.39ID:U5yMllJ4317デフォルトの名無しさん
2020/09/12(土) 20:54:09.24ID:2ljmp3qW >>314
>本当に123.345699999999って書かれてた場合と区別できるわけない
思い込みが激しいお人じゃ…
123.345699999999はギリ仮数部で表現可能な桁数に収まっているから
これは123.34569とは明確に区別可能
ていうか実際のところできたわ;;
x=0.1: rt=1/10
x=0.11: rt=11/100
x=0.111: rt=111/1000
x=0.1111: rt=1111/10000
x=0.9: rt=9/10
x=0.99: rt=99/100
x=0.999: rt=999/1000
x=0.9999: rt=9999/10000
x=0.33333: rt=33333/100000
x=123.34567: rt=12334567/100000
x=123.345678: rt=123345678/1000000
x=123.3456789: rt=1233456789/10000000
x=123.345699999999: rt=123345699999999/1000000000000
x=12.34567: rt=1234567/100000
x=12: rt=12/1
x=123E-5: rt=123/100000
>本当に123.345699999999って書かれてた場合と区別できるわけない
思い込みが激しいお人じゃ…
123.345699999999はギリ仮数部で表現可能な桁数に収まっているから
これは123.34569とは明確に区別可能
ていうか実際のところできたわ;;
x=0.1: rt=1/10
x=0.11: rt=11/100
x=0.111: rt=111/1000
x=0.1111: rt=1111/10000
x=0.9: rt=9/10
x=0.99: rt=99/100
x=0.999: rt=999/1000
x=0.9999: rt=9999/10000
x=0.33333: rt=33333/100000
x=123.34567: rt=12334567/100000
x=123.345678: rt=123345678/1000000
x=123.3456789: rt=1233456789/10000000
x=123.345699999999: rt=123345699999999/1000000000000
x=12.34567: rt=1234567/100000
x=12: rt=12/1
x=123E-5: rt=123/100000
318デフォルトの名無しさん
2020/09/12(土) 20:59:43.51ID:JdE/Bv85 そりゃ0.00002も差があれば区別できるに決まってるわな
いやまあ自分が書き間違えたのが悪いんだけど結局何が問題だか全く理解してないのね
いやまあ自分が書き間違えたのが悪いんだけど結局何が問題だか全く理解してないのね
319デフォルトの名無しさん
2020/09/12(土) 21:00:56.75ID:2ljmp3qW320デフォルトの名無しさん
2020/09/12(土) 21:08:30.19ID:EJqlmNG1 0.500000000000000166533453693773481063544750213623046875
これできる?
これできる?
321デフォルトの名無しさん
2020/09/12(土) 21:09:20.40ID:JdE/Bv85 別のリテラル表現が同じdouble値(IEEE754の値)を示す時に何をもって正しいとするかという
お前の勝手な俺様基準を何も説明しないまま公衆の面前でガチャガチャやってることが問題なんだよ
わかれ
お前の勝手な俺様基準を何も説明しないまま公衆の面前でガチャガチャやってることが問題なんだよ
わかれ
322デフォルトの名無しさん
2020/09/12(土) 21:18:05.26ID:2ljmp3qW323デフォルトの名無しさん
2020/09/12(土) 21:22:42.84ID:EJqlmNG1 いやいやそれでどやられてもw
> 10進数文字列s → IEEE 754の値x → 10進数文字列s'
> という変換は、sが非正規化数だったりIEEE 754の仮数部で表現可能な桁数を超えない限り -- (1)
> s == s'を保証可能
仮数部で表現可能かどうかってどうやって判定するわけ?
> 10進数文字列s → IEEE 754の値x → 10進数文字列s'
> という変換は、sが非正規化数だったりIEEE 754の仮数部で表現可能な桁数を超えない限り -- (1)
> s == s'を保証可能
仮数部で表現可能かどうかってどうやって判定するわけ?
324デフォルトの名無しさん
2020/09/12(土) 21:30:02.39ID:2ljmp3qW うれしげにコード貼る、
https://ideone.com/EKHKWG
実行結果は>>317と同じ
>>313の問題があるから
0.999999(9の循環小数)を1.0と見なす処置を入れた結果、考えていたテストケースは全部通った。
結局、
10進数文字列s → IEEE 754の値x → 10進数文字列s'
でs'が厳密なsの復元にならないケースがあるはずだがまだ見つかっていない。
ま、あったとしても有理数として解釈する上では数値としての大差は無いので問題ないはず、、、
https://ideone.com/EKHKWG
実行結果は>>317と同じ
>>313の問題があるから
0.999999(9の循環小数)を1.0と見なす処置を入れた結果、考えていたテストケースは全部通った。
結局、
10進数文字列s → IEEE 754の値x → 10進数文字列s'
でs'が厳密なsの復元にならないケースがあるはずだがまだ見つかっていない。
ま、あったとしても有理数として解釈する上では数値としての大差は無いので問題ないはず、、、
325デフォルトの名無しさん
2020/09/12(土) 21:33:35.13ID:2ljmp3qW >>323
入力となる浮動小数点数を文字列として書いた時点でワカル
52 bitでまったく表現しきれない桁数なら(1)を満たさない
そうでなく、かつ(xE+s表記で与えたとして)指数sが極端に小さくなければ(xの桁数+sが-1022以上なら)(1)を満たす
入力となる浮動小数点数を文字列として書いた時点でワカル
52 bitでまったく表現しきれない桁数なら(1)を満たさない
そうでなく、かつ(xE+s表記で与えたとして)指数sが極端に小さくなければ(xの桁数+sが-1022以上なら)(1)を満たす
326デフォルトの名無しさん
2020/09/12(土) 21:40:34.66ID:JdE/Bv85 >>325
なんだ、仮数部で表現可能かのチェックのために結局20億行テストコードを文字列として解析する必要があるわけね
じゃあその時に文字列として扱うようにコード直せよ
どうせそういうスクリプトが必要なんだからついでにやればいいね、よかったこれで解決だ
あほくさ
なんだ、仮数部で表現可能かのチェックのために結局20億行テストコードを文字列として解析する必要があるわけね
じゃあその時に文字列として扱うようにコード直せよ
どうせそういうスクリプトが必要なんだからついでにやればいいね、よかったこれで解決だ
あほくさ
327デフォルトの名無しさん
2020/09/12(土) 21:43:09.42ID:EJqlmNG1 >>325
は?書く?
10億行のテストコードあんだろ?
それが(1)を満たすかどうか確認する必要があるんだろ?
だいたい仮数におさまってたら大丈夫ってそりゃそうだろよ
誤差が問題なのにそれを考えなくていいケースなんだもの
は?書く?
10億行のテストコードあんだろ?
それが(1)を満たすかどうか確認する必要があるんだろ?
だいたい仮数におさまってたら大丈夫ってそりゃそうだろよ
誤差が問題なのにそれを考えなくていいケースなんだもの
328デフォルトの名無しさん
2020/09/12(土) 21:47:15.04ID:2ljmp3qW329デフォルトの名無しさん
2020/09/12(土) 21:52:28.75ID:GweMiOHC >ま、あったとしても有理数として解釈する上では数値としての大差は無いので問題ないはず、、、
ならRationalなんていらないね(´・ω・`)
ならRationalなんていらないね(´・ω・`)
330デフォルトの名無しさん
2020/09/12(土) 21:58:02.93ID:JdE/Bv85331デフォルトの名無しさん
2020/09/12(土) 22:03:02.47ID:2ljmp3qW332デフォルトの名無しさん
2020/09/12(土) 22:04:39.19ID:JdE/Bv85 あっはいどうでもいいです
(仮数部)/2^52に一番近い10^nを分母とする分数を探す簡単なさんすうの問題を解くだけの話だったんですね
がんばって
(仮数部)/2^52に一番近い10^nを分母とする分数を探す簡単なさんすうの問題を解くだけの話だったんですね
がんばって
333デフォルトの名無しさん
2020/09/12(土) 22:17:12.69ID:EJqlmNG1 手入力だから大丈夫ってのはお前しか判断できないよね?
成り立たない数字あげてもそれは手入力しないと言われるわけでしょ?
おれもあほくさくなった
成り立たない数字あげてもそれは手入力しないと言われるわけでしょ?
おれもあほくさくなった
334デフォルトの名無しさん
2020/09/12(土) 22:28:23.42ID:MEMmSzVD 俺ぐらいの達人になると、もう初期段階で
「あ、これさわったらアカン人や・・」って雰囲気でわかるようになる
「あ、これさわったらアカン人や・・」って雰囲気でわかるようになる
335デフォルトの名無しさん
2020/09/12(土) 22:31:11.00ID:GweMiOHC 10億行手入力したとか言い放つキチガイ相手にするの馬鹿らしくない?
1行/秒でも1700人月よ
1行/秒でも1700人月よ
336デフォルトの名無しさん
2020/09/12(土) 22:45:00.53ID:SzTm78BI 浮動小数点型としてメモリに載せた時点でアウト
文字列とかでやるしかなくね
文字列とかでやるしかなくね
337285
2020/09/13(日) 06:06:47.90ID:2wZmRDXk 俺の予言当たってやんのw
338デフォルトの名無しさん
2020/09/13(日) 08:25:17.62ID:Xp7zp8nz 単に誤差最小のものを選ぶだけだと>>314みたいになるから、1ULPか2ULPの誤差範囲内で
冪数が最小になるものを選ぶのがいいかな。
冪数が最小になるものを選ぶのがいいかな。
339デフォルトの名無しさん
2020/09/13(日) 12:55:10.97ID:P44KoBmR 連分数展開でディオファントス近似する方法なんてその辺にいくらでも転がってるのに
340デフォルトの名無しさん
2020/09/13(日) 18:33:50.24ID:LIu3OWuw ./hello > hello.txt
ってやったときhelloのprintfが無限ループだったら無限にhello.txtを上書きし続けますか?
ってやったときhelloのprintfが無限ループだったら無限にhello.txtを上書きし続けますか?
341デフォルトの名無しさん
2020/09/13(日) 19:12:18.99ID:eePcELKn >>340
上書きしません、追記し続けます。
上書きしません、追記し続けます。
342デフォルトの名無しさん
2020/09/13(日) 19:39:02.91ID:cE5a2Csh343デフォルトの名無しさん
2020/09/13(日) 23:14:53.91ID:n2e2K14L ./hello < hello.txt > hello.txt
344デフォルトの名無しさん
2020/09/14(月) 03:25:56.23ID:13FXnr3U Pythonで書いたGUIアプリをC++で書き直す日々が始まるお(*´ω`*)
345デフォルトの名無しさん
2020/09/14(月) 03:28:48.08ID:p1+vn7b/ イテレータを i 個分進める (戻す) のって i 回インクリメント (デクリメント) するしかないの?
一気に進める方法があったら教えて下さい
一気に進める方法があったら教えて下さい
346デフォルトの名無しさん
2020/09/14(月) 03:32:02.02ID:p1+vn7b/ ああvectorならできてsetなら無理ってことか
ググったらわかりました
すみませんでした
ググったらわかりました
すみませんでした
347デフォルトの名無しさん
2020/09/14(月) 08:44:25.84ID:NtiDKVVf >>340
わざとやってみたことあるけど
途中で飽きてきてCtrl+C
うすらでかいファイルができていた
ずーっと放置するとHDDの空き容量がなくなって
stdoutへの書き込みが失敗するようになるはず
それがOSのファイルにも使うドライブだとシステムダウンして
親ガメこけたら皆こけただね
わざとやってみたことあるけど
途中で飽きてきてCtrl+C
うすらでかいファイルができていた
ずーっと放置するとHDDの空き容量がなくなって
stdoutへの書き込みが失敗するようになるはず
それがOSのファイルにも使うドライブだとシステムダウンして
親ガメこけたら皆こけただね
348デフォルトの名無しさん
2020/09/14(月) 09:06:31.69ID:dr1ZmQsx349デフォルトの名無しさん
2020/09/14(月) 09:54:42.26ID:gMM3Z1ji350デフォルトの名無しさん
2020/09/14(月) 10:42:29.67ID:/vUb6N4m >>346
advance
advance
351デフォルトの名無しさん
2020/09/15(火) 15:20:33.02ID:WaVlZlwn typedef struct HOGE
{
int x;
int y;
HOGE(int x, int y)
{
this->x = x;
this->y = y;
}
} hoge_t;
class TEST {
hoge_t h(1, 2); // expected identifier before numeric constant
}
で、// のとおりエラーが出てしまいます。
typedef struct と class の違いが理解できていないのが悪いのですが
メンバ変数として利用するとき初期化は出来ないのでしょうか。
{
int x;
int y;
HOGE(int x, int y)
{
this->x = x;
this->y = y;
}
} hoge_t;
class TEST {
hoge_t h(1, 2); // expected identifier before numeric constant
}
で、// のとおりエラーが出てしまいます。
typedef struct と class の違いが理解できていないのが悪いのですが
メンバ変数として利用するとき初期化は出来ないのでしょうか。
352デフォルトの名無しさん
2020/09/15(火) 15:26:43.04ID:YjwP830M353デフォルトの名無しさん
2020/09/15(火) 15:40:39.25ID:rFxeOmKr354デフォルトの名無しさん
2020/09/15(火) 15:42:47.32ID:YjwP830M ブーメラン投げてんなよ
C++11からokになったの知らねえとか
勉強不足にも程があるだろうが
C++11からokになったの知らねえとか
勉強不足にも程があるだろうが
355デフォルトの名無しさん
2020/09/15(火) 15:53:03.02ID:rFxeOmKr あっそっか
コレ、メンバの初期化してんのか
てっきり文かいてんのかとおもたわ
スマンスマン
コレ、メンバの初期化してんのか
てっきり文かいてんのかとおもたわ
スマンスマン
356デフォルトの名無しさん
2020/09/15(火) 15:53:08.92ID:8CWM1WbO そもそもプロセスなんてどこから出てきたんだ?
357デフォルトの名無しさん
2020/09/15(火) 16:58:31.38ID:3HBrgqD1 >>351
それは、恐らく昔のC++では動かなかったような非常にきわどい書き方をしている。
1. まず、クラス名をtypedef宣言しても、それをどの場所でもクラス名の変わりに
使えるかどうかは、微妙。余り行われていないことで、よく調べてみないと分からない。
特に、この例の様なコンストラクタによる初期化を伴う変数の宣言の場合には、
当たり前のように出来るように見えて、コンパイラ作者目線では解析に負担がかかること。
2. static以外のメンバ変数(インスタンス変数)を、クラス宣言の中で直接初期化する
書き方は、あるバージョン以降のC++でのみできるようになってきたはずで、
その書き方に対応していないコンパイラだとエラーになる。
それは、恐らく昔のC++では動かなかったような非常にきわどい書き方をしている。
1. まず、クラス名をtypedef宣言しても、それをどの場所でもクラス名の変わりに
使えるかどうかは、微妙。余り行われていないことで、よく調べてみないと分からない。
特に、この例の様なコンストラクタによる初期化を伴う変数の宣言の場合には、
当たり前のように出来るように見えて、コンパイラ作者目線では解析に負担がかかること。
2. static以外のメンバ変数(インスタンス変数)を、クラス宣言の中で直接初期化する
書き方は、あるバージョン以降のC++でのみできるようになってきたはずで、
その書き方に対応していないコンパイラだとエラーになる。
358デフォルトの名無しさん
2020/09/15(火) 17:03:32.49ID:3HBrgqD1 >>357
1に関して。
まず、typedef宣言自体が、ポインタや配列や関数型などが複雑に絡んだ
「組み立て型」を簡単に表すためと、
C言語では、構造体型をそのまま型名として使うことができず、typedefを
使わなければ、「struct タグ名」とstructを省略できなかったので、
typedefが好んで使われた。
ところが、C++では、structやclassキーワードを書かなくても、いきなり
タグ名を書いても型名として扱われる。だから、class名/struct名を敢えて
typedef宣言する人は非常に少なくなった。なので、そのような書き方に
滅多に遭遇しないので、テスト不十分でコンパイラにバグが残っている可能性がある。
1に関して。
まず、typedef宣言自体が、ポインタや配列や関数型などが複雑に絡んだ
「組み立て型」を簡単に表すためと、
C言語では、構造体型をそのまま型名として使うことができず、typedefを
使わなければ、「struct タグ名」とstructを省略できなかったので、
typedefが好んで使われた。
ところが、C++では、structやclassキーワードを書かなくても、いきなり
タグ名を書いても型名として扱われる。だから、class名/struct名を敢えて
typedef宣言する人は非常に少なくなった。なので、そのような書き方に
滅多に遭遇しないので、テスト不十分でコンパイラにバグが残っている可能性がある。
359はちみつ餃子 ◆8X2XSCHEME
2020/09/15(火) 17:21:18.89ID:Gxy/396Z >>358
メンバ関数を含まない struct (つまりは POD) なら、
C のヘッダファイルとしても使えるように書く場合は珍しくもないと思うよ。
コンパイラのバグを心配し始めたらなんもできなくない?
主要なコンパイラでよほど長く改善できてないバグだったり、
(特殊な開発環境などで) 実際に使わざるを得ない特定のバージョンにバグがある
ことが分かっているときなら配慮もするけど、
普段の習慣として気にするほどのことじゃないでしょ。
メンバ関数を含まない struct (つまりは POD) なら、
C のヘッダファイルとしても使えるように書く場合は珍しくもないと思うよ。
コンパイラのバグを心配し始めたらなんもできなくない?
主要なコンパイラでよほど長く改善できてないバグだったり、
(特殊な開発環境などで) 実際に使わざるを得ない特定のバージョンにバグがある
ことが分かっているときなら配慮もするけど、
普段の習慣として気にするほどのことじゃないでしょ。
360デフォルトの名無しさん
2020/09/15(火) 17:22:04.43ID:GPrkorqi hoge_t h = {1, 2};
で普通にコンパイル通るんだが
class TEST のインスタンスが造られる度に実行されるのか
それともあるインスタンスで変更されたら
次に造られるインスタンスは後者の値になるのか
で普通にコンパイル通るんだが
class TEST のインスタンスが造られる度に実行されるのか
それともあるインスタンスで変更されたら
次に造られるインスタンスは後者の値になるのか
361はちみつ餃子 ◆8X2XSCHEME
2020/09/15(火) 17:33:54.20ID:Gxy/396Z362デフォルトの名無しさん
2020/09/15(火) 17:49:15.00ID:3HBrgqD1 実は、
z x(a,b);
の形式は、コンパイラが関数xのプロトタイプ宣言と、引数付きのコンストラクタ
呼び出しによる変数xの初期化の区別を付けるのが難しい例として知られている。
その区別は、基本的にはaの部分が型名なのか、型名でないのかで区別される。
それに加えて、zの部分にtypedef名を書くと、コンパイラはいろいろなことを配慮
しなくてはならなくなる。
関数のプロトタイプ宣言と、メンバ変数の定義では、コンパイルの流れが大きく変わるので、
なるべく早い段階でそれらを区別しなければならない。
余り深く解析しすぎてはコンパイル時間が増大してしまう。
だから、適度にヒューリスティックな方法で判別していることがある。
ヒューリスティックな方法なので、滅多に書かない特殊な書き方をした場合、間違えてしまう可能性があるかもしれない。
z x(a,b);
の形式は、コンパイラが関数xのプロトタイプ宣言と、引数付きのコンストラクタ
呼び出しによる変数xの初期化の区別を付けるのが難しい例として知られている。
その区別は、基本的にはaの部分が型名なのか、型名でないのかで区別される。
それに加えて、zの部分にtypedef名を書くと、コンパイラはいろいろなことを配慮
しなくてはならなくなる。
関数のプロトタイプ宣言と、メンバ変数の定義では、コンパイルの流れが大きく変わるので、
なるべく早い段階でそれらを区別しなければならない。
余り深く解析しすぎてはコンパイル時間が増大してしまう。
だから、適度にヒューリスティックな方法で判別していることがある。
ヒューリスティックな方法なので、滅多に書かない特殊な書き方をした場合、間違えてしまう可能性があるかもしれない。
363デフォルトの名無しさん
2020/09/15(火) 19:13:25.13ID:glwHIVnw なんでここってそんな殺伐と喧嘩腰みたいなやつ多いの?
もっと柔らかくさ切磋琢磨してこうよ
もっと柔らかくさ切磋琢磨してこうよ
364デフォルトの名無しさん
2020/09/15(火) 19:25:55.43ID:cZkGG5+C class TEST {
hoge_t h;
TEST() : h{1, 2} {}
};
のほうがわかりやすくね
hoge_t h;
TEST() : h{1, 2} {}
};
のほうがわかりやすくね
365デフォルトの名無しさん
2020/09/15(火) 19:25:55.43ID:cZkGG5+C class TEST {
hoge_t h;
TEST() : h{1, 2} {}
};
のほうがわかりやすくね
hoge_t h;
TEST() : h{1, 2} {}
};
のほうがわかりやすくね
366デフォルトの名無しさん
2020/09/15(火) 19:26:49.33ID:cZkGG5+C うおダブルクリックしちゃった
てかJavaScriptで防止しとけよw
てかJavaScriptで防止しとけよw
367デフォルトの名無しさん
2020/09/15(火) 19:28:11.48ID:cZkGG5+C コンストラクタにpublicつけ忘れた
368デフォルトの名無しさん
2020/09/15(火) 20:39:52.74ID:Zw0qp59Z コードを書くとききは、最低限簡単なテストコードで
コンパイルが通るかどうか確認してから書きなさい
技術系ブログですらそのルール守ってない事があり
そういうブログはたいてい読むに値しない
コンパイルが通るかどうか確認してから書きなさい
技術系ブログですらそのルール守ってない事があり
そういうブログはたいてい読むに値しない
369デフォルトの名無しさん
2020/09/15(火) 20:59:22.26ID:eg5KpnfE >>351
#include <iostream>
using namespace std;
struct Hoge{
int x;
int y;
Hoge(int x, int y){
this->x = x;
this->y = y;
}
};
int main() {
Hoge h(1, 2);
cout << h.x << endl;
return 0;
}
GVkKul - Online C++0x Compiler & Debugging Tool - Ideone.com
https://ideone.com/GVkKul
余り深く考えないならこんなんでいいんじゃなかろうか
#include <iostream>
using namespace std;
struct Hoge{
int x;
int y;
Hoge(int x, int y){
this->x = x;
this->y = y;
}
};
int main() {
Hoge h(1, 2);
cout << h.x << endl;
return 0;
}
GVkKul - Online C++0x Compiler & Debugging Tool - Ideone.com
https://ideone.com/GVkKul
余り深く考えないならこんなんでいいんじゃなかろうか
370デフォルトの名無しさん
2020/09/15(火) 21:01:17.48ID:cZkGG5+C explicit Hoge(int x, int y)
にしろと言う派もいそう
にしろと言う派もいそう
371デフォルトの名無しさん
2020/09/15(火) 21:07:56.21ID:YjwP830M アホ人口が過密すぎ
372デフォルトの名無しさん
2020/09/15(火) 21:43:29.84ID:sNNyLA9G こうですか?
わかりません><;
■ 小数を含む10進数の表記の再現に関する定理
有限桁の10進数で表記された非負の数x0をIEEE 754形式(2進数版)に変換して
xを得たとして、x0の最小の桁が10^mの位、xの仮数部のLSBが2^pの位ならば、
m > p * log10(2)
を満たす限り、xからx0の最小の桁まで正確に再現できる。
■ 証明
x0の最小の桁が10^mの位(10^mより小さい位が無い)ということは、
x0は周期10^mの格子点上にある。(kを適当な整数として、x0=k*10^mと表すことができる。)
一方、x0をxに変換する際、仮数部のLSBが丸めで繰り上がらなかったとすると、
x ≦ x0 ≦ x + 2^(p-1)
が成り立ち、仮数部のLSBが丸めで繰り上がった場合は
x - 2^(p-1) ≦ x0 ≦ x
が成り立つ。(全ての不等号が等号付きなのは、偶数丸めの可能性を考慮している。)
合わせると、どっちにせよ以下の式が成り立つ:
x - 2^(p-1) ≦ x0 ≦ x + 2^(p-1) -- (1)
x0が周期10^mの格子点上であることから、式(1)より
(2^(p-1) - (- 2^(p-1))) < 10^m ∴ m > 2 * log10(2)
であれば、xから式(1)を満たすx0が一意に定まり、
周期10^mの格子点上に位置する他の数と区別できる。
□
わかりません><;
■ 小数を含む10進数の表記の再現に関する定理
有限桁の10進数で表記された非負の数x0をIEEE 754形式(2進数版)に変換して
xを得たとして、x0の最小の桁が10^mの位、xの仮数部のLSBが2^pの位ならば、
m > p * log10(2)
を満たす限り、xからx0の最小の桁まで正確に再現できる。
■ 証明
x0の最小の桁が10^mの位(10^mより小さい位が無い)ということは、
x0は周期10^mの格子点上にある。(kを適当な整数として、x0=k*10^mと表すことができる。)
一方、x0をxに変換する際、仮数部のLSBが丸めで繰り上がらなかったとすると、
x ≦ x0 ≦ x + 2^(p-1)
が成り立ち、仮数部のLSBが丸めで繰り上がった場合は
x - 2^(p-1) ≦ x0 ≦ x
が成り立つ。(全ての不等号が等号付きなのは、偶数丸めの可能性を考慮している。)
合わせると、どっちにせよ以下の式が成り立つ:
x - 2^(p-1) ≦ x0 ≦ x + 2^(p-1) -- (1)
x0が周期10^mの格子点上であることから、式(1)より
(2^(p-1) - (- 2^(p-1))) < 10^m ∴ m > 2 * log10(2)
であれば、xから式(1)を満たすx0が一意に定まり、
周期10^mの格子点上に位置する他の数と区別できる。
□
373はちみつ餃子 ◆8X2XSCHEME
2020/09/15(火) 22:07:33.21ID:Gxy/396Z >>364
それはどうだろう。 慣れという面は大きいと思うよ。
普通のローカル変数は変数の宣言と初期化は一体なわけだし、
その記法と一致させた方がよくない? ってのは有るでしょ。
でも初期化のタイミングが (ある程度は) 見かけ通りになって欲しいという感覚からは
コンストラクタの方で初期化した方が自然だよなってのも有る。
それはどうだろう。 慣れという面は大きいと思うよ。
普通のローカル変数は変数の宣言と初期化は一体なわけだし、
その記法と一致させた方がよくない? ってのは有るでしょ。
でも初期化のタイミングが (ある程度は) 見かけ通りになって欲しいという感覚からは
コンストラクタの方で初期化した方が自然だよなってのも有る。
374デフォルトの名無しさん
2020/09/15(火) 22:07:55.51ID:y4mQo5lg それもういいから
375はちみつ餃子 ◆8X2XSCHEME
2020/09/15(火) 22:08:53.69ID:Gxy/396Z そういう感覚的な部分は置いてちょっと便利な使い方としては、
コンストラクタが複数あってそれぞれが初期化したい対象が違う場合に
共通する部分は宣言と同時に初期化するように書くという方法。
こんな感じね。
struct foo {
int mem_i = 1;
double mem_d = 2;
char mem_c = 3;
foo(int i) : mem_i(i) {}
foo(double d) : mem_d(d) {}
foo(char c) : mem_c(c) {}
};
以下のように書くよりはマシでしょ。
struct foo {
int mem_i;
double mem_d;
char mem_c;
foo(int i) : mem_i(i), mem_d(2), mem_c(3) {}
foo(double d) : mem_i(1), mem_d(d), mem_c(3) {}
foo(char c) : mem_i(1), mem_d(2), mem_c(c) {}
};
宣言と同時の初期化が書かれていてコンストラクタでも初期化が書かれているときは
コンストラクタでの初期化のみが有効になる。
コンストラクタが複数あってそれぞれが初期化したい対象が違う場合に
共通する部分は宣言と同時に初期化するように書くという方法。
こんな感じね。
struct foo {
int mem_i = 1;
double mem_d = 2;
char mem_c = 3;
foo(int i) : mem_i(i) {}
foo(double d) : mem_d(d) {}
foo(char c) : mem_c(c) {}
};
以下のように書くよりはマシでしょ。
struct foo {
int mem_i;
double mem_d;
char mem_c;
foo(int i) : mem_i(i), mem_d(2), mem_c(3) {}
foo(double d) : mem_i(1), mem_d(d), mem_c(3) {}
foo(char c) : mem_i(1), mem_d(2), mem_c(c) {}
};
宣言と同時の初期化が書かれていてコンストラクタでも初期化が書かれているときは
コンストラクタでの初期化のみが有効になる。
376デフォルトの名無しさん
2020/09/15(火) 22:17:19.74ID:cZkGG5+C 今まで全部下の方法で書いてたわ
そしてやめる気もない
そしてやめる気もない
377はちみつ餃子 ◆8X2XSCHEME
2020/09/15(火) 22:33:53.09ID:Gxy/396Z ただ、 >>375 にも良くない面はあって、
ヘッダファイルでクラス定義をして
コンストラクタの実装は .c に書いた場合、
// foo.h
struct foo {
int mem_i = 1;
double mem_d = 2;
char mem_c = 3;
foo(int i);
foo(double d);
foo(char c);
};
// foo.c
foo::foo(int i) : mem_i(i) {}
foo::foo(double d) : mem_d(d) {}
foo::foo(char c) : mem_c(c) {}
ヘッダファイルからは 1, 2, 3 で初期化するかのように見えて実際にはそう初期化しないことがある
ってのは混乱の元になるかもしれないと思う。
ワイとしてはどう運用 (使い分け) すればいいのかはっきりした見解を確立できてない。
どうすればいいんやろね?
ヘッダファイルでクラス定義をして
コンストラクタの実装は .c に書いた場合、
// foo.h
struct foo {
int mem_i = 1;
double mem_d = 2;
char mem_c = 3;
foo(int i);
foo(double d);
foo(char c);
};
// foo.c
foo::foo(int i) : mem_i(i) {}
foo::foo(double d) : mem_d(d) {}
foo::foo(char c) : mem_c(c) {}
ヘッダファイルからは 1, 2, 3 で初期化するかのように見えて実際にはそう初期化しないことがある
ってのは混乱の元になるかもしれないと思う。
ワイとしてはどう運用 (使い分け) すればいいのかはっきりした見解を確立できてない。
どうすればいいんやろね?
378デフォルトの名無しさん
2020/09/15(火) 22:40:25.54ID:cZkGG5+C struct foo {
int mem_i = 1;
double mem_d = 2;
char mem_c = 3;
foo(int i);
foo(double d);
foo(char c);
};
こういうことするとfooは文脈依存で意味が違う紛らわしい存在になる
このfoo自体存在しないでほしい
int mem_i = 1;
double mem_d = 2;
char mem_c = 3;
foo(int i);
foo(double d);
foo(char c);
};
こういうことするとfooは文脈依存で意味が違う紛らわしい存在になる
このfoo自体存在しないでほしい
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- JA全農が「新おこめ券」…来年9月末の有効期限を新設、必要経費のみ上乗せ [蚤の市★]
- 1人3千円の食品高騰対策、何に使える? あいまいなまま衆院通過 [蚤の市★]
- 「働いて働いて」の流行語大賞に懸念 「言葉が独り歩き」 過労自殺遺族 [尺アジ★]
- アメリカ、入国時に「日本人を含む外国人観光客の最大5年分のSNS履歴の提出」義務化へ 過去10年間に使用のメールアドレスや電話番号等も★3 [Hitzeschleier★]
- ゆたぼん 二重手術を報告「めちゃくちゃ気に入っています」 [muffin★]
- 【EV新税】最大2万4千円で検討 28年から、普及妨げると異論も [蚤の市★]
- 【実況】博衣こよりのえちえちダンガンロンパ2🧪★3
- 【実況】博衣こよりのえちえちダンガンロンパ2🧪★2
- 【貧】高市悲報!過去最安値を更新!対人民元で円が、、 [219241683]
- TikTokの高市政権応援動画、限界突破 もう終わりだよこの国 [594040874]
- 【悲報】高市早苗、被災民に対し「自分の命くらいは自分で守ってくださいね」と切り捨てし大炎上 [339712612]
- 日本人「(今回の地震は)中国の人工地震兵器だ」「(駆除した)クマサンのタタリじゃ」 [377482965]
