if (abs (a-b) < EPS) . . .
彼らはすべてのプロジェクトに同じ1e-8番号を素朴に選択し、重大なエラーの潜在的な場所を作成しました。さらに、彼らは次のように2つのダブルを比較しようとしました。
if (a < b) . . .
そんなナンセンスを見たのになぜ叱ったのかわからない。私は0x400921fb54442d18のような定数がどのような恐怖を引き起こす可能性があるかについてさえ話していません(ただの数)これは、一部の古いプログラムまたはデバッガー画面で確認できます。

デバッグの過程で、同僚が2つの数値を加算しようとしても、doubleの式が変わらないことを発見し、コンパイラまたはデバッガのエラーで罪を犯し始めました。どのような場合に2つの数値の合計が1つの項のみに等しいかを説明するまでです。 ..。
番号の並べ替えのトリックも多くの人にとって恐ろしいものです。StackOverflowでは、式の小さな変更が異なる結果につながる理由と、コードの最適化が完全に間違った答えにつながる理由について、ユーザーから当惑する質問をよく目にします。かつて、ユーザーの1人が、整数を64ビットから倍精度の数値に変換してから元に戻したときにプロセッサでエラーを見つけたと指摘し、別の数値を取得しました。彼は明らかに、そのような変換で少なくとも11ビットがどのように失われるかを知りませんでした。そして、そのような無知は、彼がすべてがどのように機能するかを知っていると確信している人々の間でも見られます。
Habréでさえ、著者が浮動小数点数の理解できない振る舞いを「暴露」し、彼らの発見を新しくて未知の、明白で神秘的なものとして見送るという記事がしばしばあります。一見プロのプログラマーによって書かれたそのような記事を見るのは奇妙です。公表はしませんので、ご自身でお探しください。
さまざまなトレーニング資料で問題を解決できるように思われますが、そうではありません。原則として、読者は、作者がすぐに彼に投げかける式と理解できない言葉に怯えています:正規化された数、隠された単位、偏った指数-そして、このソリューションまたはそのソリューションがIEEE-754標準に登場した理由を説明せずに、理論のドライプレゼンテーションが始まります。このトピックに関するビデオ講義も多様性に輝いていません。誰もが同じ原始的な例を分析しているようです。そこではすべてが迅速かつ美しくなります...そして学生は、コンパイラのほぼ100%がエラーのある浮動演算で動作するとは決して推測しません。これは理解できます。そのような教師自身は、何が何から来てどのように機能するのかを知らないため、自分が理解していることだけを伝えます。彼ら自身が浮動小数点演算の世界を発見したのは昨日だけであることは明らかですが、彼らはすでに急いで混乱しています。彼について教えてください。私は非難しませんが、公の場でのそのような行動は容認できないと思います。
だから私は状況を修正しようと決心し、ある意味で作成しましたトライアルトレーニングコース。フローティングポイント演算の世界にスムーズに没頭できるビデオコースです。最初の4つのレッスンでは、10進数システムと、状況によって1つまたは別の数値システムを作成し、最終的にこの形式の浮動小数点システムに到達する方法について説明します。正規化はどこから来て、なぜそれが必要なのですか?連想性の問題はどこから来るのですか?精度が失われる方法と理由、およびそれをどうするか?絶対に禁止されていることとその理由は何ですか?なぜ非正規化された数値がそのようなシステムに現れるのですか、そしてそれは一般的に何ですか?次に、次の4つのレッスンでは、このすべての知識がバイナリ演算にどのようにうまく適合し、隠されたビットのアイデアがどこから来ているのかを示します。最初の「ひどい式」が画面に表示されたら、視聴者はすでに頭の中に浮動小数点演算の必要なイメージを持っており、そのような式の論理を簡単に理解しています...もちろん、彼が正しく演習を行った場合。これらの8つのレッスンはすべてコースの最初の部分であり、初心者向けです。 2つ目は上級プログラマー向けで、現在開発中です。
なぜテキストではなくビデオなのか?説明は簡単です。私はさまざまな形式を試しましたが、初心者には読みにくいと感じています。注意深く読む方法を知っている人は誰でも、教科書を開いて、公式でテキストを読み、理解し、理解するでしょう。読みづらい、難しいことに怯えている、お茶を飲みながら勉強しやすいという方には、音声でスムーズにビデオ形式に没頭するのが適しています。たっぷりの水?はい、可能ですが、このコースは、プログラムをしたいが、学校で数学に興味がなかった人のためにも設計されています。したがって、あなたにとっての「水」は水ではなく、学校ですでによく知っていることであり、私の学生の多くはそうではありません。彼らに見下している、私たちは皆どこかから始めました。また、このビデオは、本格的な教科書を読むための準備として見ることもできます。同意します。教科書を開いて、そこに書かれていることをはるかに速く理解すると、それは素晴らしいことです。目的の画像がすでに頭の中にあるからです。
私について:以前はプロの教師で、大学で11年間働き、数学とプログラミングを教えていました。近年、高性能コンピューティング用の数学ライブラリを開発しています。私はターゲットオーディエンスが何を望んでいるのかをよく理解しており、プログラミングの世界でこのトピックに何が求められているのかをよく理解しています。したがって、私にはそのようなコースを作成する権利があると信じています。品質(コンテンツの点で)が似ている講義を自分で見ることができます。あなたは今ロシア人を見つけることができません。見てみな!最初の4つのレッスンは、すでに多くの興味深いことを学ぶことができますが、完全に無料です。必要に応じて、残りの部分を実行できます。それらはさらに興味深いものですが、有料です。他の誰かの仕事は尊重されなければなりません:私はそうではありません私は知識を売りますが、教育活動を続けるには支援が必要なので、時間はお金の価値があります。一般的に、Habréに関する他の記事から、私の仕事の質について結論を出すことができます。
私たちのVKコミュニティに参加する人のために、あなたがPMに連絡すれば、私は50%の割引を提供することができます。ZealComputing School(無料)に登録して、最初の4つのレッスンをご覧ください。または、YouTubeにあります(最初のものはここにあり、さらに説明からのリンクにあります)。はい、私がリンクしている紹介ビデオを見る必要はありません。それは単なる広告です。
有料レッスンのまとめ
レッスン5:初めてバイナリ番号システムに移りましょう。 IEEE-754フォーマットに非常に近い美しくシンプルな6ビットフローティングポイントモデルを構築します。これは最も重要で最も難しいレッスンです。前の4つのレッスンは、浮動小数点演算で特定のものがどこから来るかを示すように設計されました。これで、おもちゃとわかりやすい例を使用して、これらのものがIEEE-754形式でどのように美しく表示されるかを理解できます。
レッスン番号6:丸めの導入。それは通常の数学ほど明白ではありません。他のビデオ教師が提供する最も単純な例では、何がわかりにくいかを学びます。つまり、10進数システムからIEEE-754形式に数値を変換することが非常に困難な場合があり、一部のコンパイラでは正しく変換できません。理論的にはすべてが非常に単純であるが、実際にはそうではない理由を詳しく説明します。
レッスン番号7:ここでは、binary32およびbinary64形式(floatおよびdouble)を完全に習得し、C ++で数値のビット表現を表示する方法を示します(他の言語でも可能ですが、すべてではありませんが、GoogleまたはYandexを参照して、それがいかに簡単であるかを示します、たとえば、Javaソリューションを見つけます)。このレッスンの後、浮動小数点数の構造(演習を上手く行った場合)は完全に明確になり、前のレッスンで回答されなかった質問を提起することはできません。
レッスン番号8:浮動小数点演算を使用するための実用的なガイド。すでに説明した機能と新しい瞬間のいくつか:可換性の喪失、連想性、いわゆる「平等」の予期しない兆候。そして最も重要なヒント!このアドバイスは、一般的な重要ではないタスクでのすべての間違いをほぼ100%回避するのに役立ちます。次に、二重丸めエラー、つまり重要な桁の壊滅的な損失について説明します。それがいつどのように発生するかです。一般に、このレッスンでは、高度な数学を必要としないすべての簡単な練習について説明します。
コースには他に何が含まれていますか?そして、これ以上何も必要ありません!レッスンについて質問することはできますが、発生しないと確信しています。各レッスンには回答付きの包括的な演習が含まれているため、一般的に参加する必要はなく、低価格です。インストラクター、コミュニケーション、メンター付きワークショップ、ライブレクチャーを含む完全なコースは、10倍の費用がかかります。
幸せな学習!