【初心者歓迎】C/C++室 Ver.100【環境依存OK】 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ◆ソースのインデントについて 半角空白やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのも手ですが直接貼る場合は、 全角空白か に置換すると見栄えだけはよくなります。 【アップローダー】(質問が長い時はココ使うと便利) http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック) http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用) 前スレ 【初心者歓迎】C/C++室 Ver.99【環境依存OK】 http://echo.2ch.net/test/read.cgi/tech/1469177649/ >>771 解をレンジで持ち続けて何か解決出来ると思うか? >>765 レベルの人が mpir、gmpだろ。これ使えば円周率1万でも1億でも正確に計算できるはず 有理数を有理数のまま保持している分には、四則演算では誤差が発生しない もちろんオーバーフローしない条件で doubleで計算を前提とし、誤差が問題となりやすい場面だけ教えてあげれば十分 実際、浮動小数点型の誤差は無視できないぞ。 float型とか、容量が少ないほど。情報処理の入門書の最初から出てくる話題だろ。 いい加減スレタイ変えろよ 【初心者姦ゲイ】C/C++室 Ver.100【姦狂依存OK】 >>777 無視できる場合もあるし出来ない場合もある floatや半精度があるのはそれで十分な場合があるから doubleより前に、整数演算の誤差を学ばなければならないレベルかも コーディング規約で float、doubleは使用禁止が正解 1/3の結果に3を掛けても1にならないとか、 0.1を10回足し合わせても1と一致しないとか、 その辺りは分かっているのかな? >>782 質問者は浮動小数点数の演算のどこに注意点があるか分かっていない状態で、 いいから浮動小数点数は使うな、 というのは回答として乱暴過ぎるだろう。 ・同じ計算をするんでも なるべく精度の高いアルゴリズムを選ぶ ・0との比較では、絶対値と計算機epsilonの比較を用いる 他にある? >・0との比較では、絶対値と計算機epsilonの比較を用いる 何かとごっちゃになってる気がする。 計算の収束判定等で用いるのは機械イプシロンじゃない。 >>785 0との比較に限らず、比較には絶対値の大きさに応じたεの考慮が必要。 数桁のdouble計算で誤差が問題になる場面では「誤差が存在する」ことが問題であって、精度を上げることは(誤差の大小は)本質的な解決でないような (3.1 - 2.9 > 0.2) != (3.1 > 2.9 + 0.2)みたいな 計算順序で誤差が違ってくるのは教科書でよくかいてある 情報処理資格に受かっていない人が、C/C++ をプログラミングするなど、10年早い C/C++ は、直接デバイスを扱うから、自作パソコンを作れるぐらいに、 かなりパソコン内部の装置の仕組みを、知っていないと無理 さらに組み込みなら、高度情報処理のエンベッド資格も必要 お前は試験に受かってからプログラミング始めるのかw パソコンって、アドレスバスの、メモリ読み書きで、 デバイスを、直接操作するのか? それとも、アドレスA0000に文字を書き込むのか? その知識、30年くらい、遅くね? >>785 コストも考えなさい epsilonは>>786 の通り 補足すると、 収束判定に限らず、普通はepsilonで判定しない >>792 情報処理資格www なんの役にもたたない 前回、共用体の非アクティブメンバーアクセスが許されるcommon initial sequenceの条件である「型の互換性」に目を付けたレスを見た時は >>792 がもう少し見所の有る奴だと思っていた(過去形) >>797 すまん、1/3は1.0/3とか書くべきところだったな。 1.0/3.0*3.0 が 1.0にならないことがある 1/3*3 が 1にならない 小数演算特有ではない 0.1を10回足しても1にならないことがあるって言うのも小数特有ではない 0.1は普通のfloatやdoubleでは表現できず、コンパイル時に近似値に変換する この意味では以下と本質的には同じ int a = 0.1; int b = a * 10; >>792 自作って高価なプラモデルだぞ。。。 夢見過ぎ。 直接ってもなぁ。。。 昔はx86限定で直接レジスタ弄れる命令あったんだが、その命令は今じゃ優先的にレジスタ使ってね☆って意味に変質してるもんなぁ。。。 今のCは思ってるより下級言語じゃ無いぞ。 普通の言語よりゃハードに近いけどさ。 doubleがintに比べて誤差が少ないため、誤差を気にせずに使ってしまいやすい だから注意の意味を含めて誤差が大袈裟に語られる傾向がある 当然整数の方が(普通は)はるかに誤差が大きい >>805 それは知ってるけど元の質問者がdoubleの演算誤差について聞いているのだから、整数の除算の件は話が外れていると思う。 この手のスレに良くあることだけど、元の質問から勝手に話が発散して何を目的に議論しているのかが分からなくなるね。 いやだから、 気を付けるべき点は >>769 の後半にまとめたつもりだけど よくやりがちな例は、 for (double a = 0; a <= 1 ; a += 0.1) みたいな比較と double a = sqrt(3); double b = a * a; int c = b; みたいな整数丸め これは、 double に限らす10000桁精度の演算ライブラリでも全く同じ問題がほぼ同じ率で起こる 前者はループが10回か11回かはバクチで、 後者はcが2になるか3になるかはバクチ なんかそんなの読んだことあるな。 計算結果は精度の範囲内だけど、計算途中で精度超えて結果に誤差が出る的な。 なんか対策あったぞ。 >>798 普通は計算機epsilonで判定は しない、これはわかりました じゃあどんな値で判定するんですか? >>792 カーニハンもリッチーも受かっていないようだが? >>815 対象の値が含み得る誤差を用いる。 機械イプシロン(を指数によってスケールしたもの)は誤差の下限を示しているだけに過ぎない。 VisualC++とそれ以外用とで別の関数を用意して、プリプロセッサを使用してコンパイル時に選択したいと思っています この場合、関数全体を#ifdef _MSC_VER〜#endifで囲うことになるのですか? もう少しきれいな書き方があれば教えてください よろしくお願いします >>819 機種依存部分をライブラリ化してリンク時に差し替えるとか 関数全体を切り替えたいなら関数全体を複数記述するしかあるまい 部分的に違うだけならその違う部分的だけ切り替えればいい 関数全体を複数記述する方法はいくつかある >>819 別にそれでいいじゃん。大量にあるならファイル分ければいいし class A {} int main{ A a; //c++ A a = new A(); //c# } このc++の「A a;」は、c#の「A a = new A();」と同じ意味ということでいいんですか? >>823 同じになるねぇ あえて違う点を挙げるとすればAが作成される領域がスタックかヒープか でも意識するほどのことじゃない >>824 スッキリしました。ありがとうございます。 いやC++やるならスタックかヒープかは意識しなきゃだめだろ deleteどうすんの >>824 > Aが作成される領域がスタックかヒープか いや、それは意識しろよ C#はdelete書かないんだからC++なら deleteが不要な「A a;」を同等と捉えるのが筋 配置場所なんかどうでもええ 寿命だのコストだの言うけど そんな実相依存どうやって見積もるの? 無意味な揚げ足取りはやめたら? C++ 側は実装依存な部分あるっけ? C#側はよーわからんけど こっちはC++スレだぞ?C++でスタックとヒープのコストや寿命の違いを意識する必要がないってマジでいってるのかよ newの方はC#のって前置きがあるだろうが よく読め まあ元々の質問もあれだが コストは c++のnew>>(超えられない壁)>>c#のnew>スタック 全然違うというほどでもないし コストは置いておいたとしても寿命はどうするんだよ 平たく言うと 「マニュアル車の1速は、オートマ車のDと同じ意味ですか?」 って質問だぞ それに対して 「オートマ車はDで発進するからマニュアル車なら1速と同等ととらえるのが筋 速度が出た後のことなんかどうでもええ」 ってのはなんか違うだろ メモリ管理に関してはC++はマニュアルでC#はオートなんだから こういうたとえになるんだよ >>837 おまいさん資格持ちじゃないよな?な?な? あと、C#はJavaと違って構造体が使えてこれは値型になれるから スタックに確保できる なんで、C++の A a; はどちらかというと、そちらに該当するんだよ で、C#のA a = new A(); はというと delete が必要という一点を除けば C++ の A *a = new A();に相当するんだよ こんなこと当たり前だろ >>845 実装と目的を一緒にすんなよタコ 単に「Aのインスタンス生成するコード書いてみ」 といわれたら>>823 になるだろjk 意味が同じってのはそういうこった >単に「Aのインスタンス生成するコード書いてみ」 ってのはお前が勝手に言ってることだろ 元は >このc++の「A a;」は、c#の「A a = new A();」と同じ意味ということでいいんですか? だ 超えられないかはともかく、newに限って言えばGC言語の方が低コストでもおかしくない。 厳密にどうかじゃないんだよ 初心者がこれから言語を勉強していくのに より得になる方はどっちだってことよ GCだからー、ヒープだからーって そんな答えおよびじゃないっつーの どの程度の初心者かわからないだろ C#と比べてるってことは既にC#をそこそこマスターしているかもしれないだろ その状態でC++に手を出そうとしていたとしたら、どうだ? C#とC++の違いなどを書いたほうが良いだろ >>850 初心者だからこそ、上っ面の文法の違いだけで捉えて、こうすればだいたい同じとか説明する前に、 前提としてメモリ管理の考え方が違うことを理解してもらうのは重要だろう。 もういいよ、まとめると C++ではインスタンス生成(アドレスの決定)は二種類のやり方がある A a; A* pa = new A(); 前者はスタックのアドレスが割り当てられ、後者は通常はヒープのアドレスが割り当てられる。 前者はスコープが寿命で、後者はdelete pa;されるまでが寿命。 C#ではインスタンス生成の方法は値型、参照型でそれぞれ一種類ずつしかなく、 A a; //struct A B b = new B(); //class B 前者はスタックのアドレスが割り当てられ、後者はヒープのアドレスが割り当てられる。 前者はスコープが寿命で、後者はdelete pa;されるまでが寿命。 どれとどれを同じと思うかは人それぞれ。 終了 C# の後者の寿命は? delete pa は C++ だよね >>856 おっと、間違えた C#の後者の寿命はGCに回収されるまででした >>856 ご苦労さん 何故この話題がここまで伸びたんだろ 異なる考えの言語同士であるため対応が自明でないという事実を無視して 自分の考える「同じ意味」の解釈を押し付けるからに相違ない >C#ではインスタンス生成の方法は値型、参照型でそれぞれ一種類ずつしかなく、 >A a; //struct A なるほどこうやって言語仕様を確認せず想像をたれ流すので世の中が嘘だらけになるのだな >>860 ん、C#のほうはそれであってるだろ StringとかDateTimeみたいな一部の例外を除けば >異なる考えの言語同士であるため対応が自明でないという事実を無視して >自分の考える「同じ意味」の解釈を押し付けるからに相違ない ん?だからそれに基づいてほとんどの人は 「違う意味だよ〜」って言ってたんじゃなかったの? 一部の人が「同じような意味だよ〜」って言ってただけで それに反論する流れだったでしょ だから「同じ意味」の解釈の押し付け合いはしてなくて 同じ意味だよ vs 違う意味だよ だったと思うけど 同じ様な意味と同じ意味は違う さらっと言葉をすり替えるなよ まったく卑怯な奴よの (つーか同じ様な意味とも言っていない) >>862 >だから「同じ意味」の解釈の押し付け合いはしてなく 「同じ意味」の基準について合意していないのに「ここが違うから別」とだけ言うのは「同じ意味」の解釈の押し付けに他ならないと思うのだが、 もう少し日本語の字面でなく意味を理解した方がよいのではないか >「違う意味だよ〜」って言ってたんじゃなかったの? →Yes >同じ意味だよ vs 違う意味だよだった →Yes >>861 合っているかと訊かれれば合っていないので、言語仕様を読むか当該のスレッドで訊くのが良いのでは あとStringやDateTimeの例外というのが何なのかよくわからなかった リンク先を見て思ったのだが こだわりじゃなくて罵られることに喜びを覚えるマゾなのではないかと言う気がした >>870 正しく指摘できないのならレスしないほうがいい あなたの思ういちばんすこいC#の仕様の世界で生き続けてくだはい アーメン ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる