浮動小数点挔算に぀いお知っおおくべきこず





遠い時代、IT業界にずっおは、これは前䞖玀の70幎代で、数孊者プログラマヌは以前呌ばれおいたしたはドンキホヌテのように、圓時の小さな颚車のサむズのコンピュヌタヌずの䞍平等な戊いで戊いたした。 深刻なタスクが蚭定されたした軌道からの画像からの海掋の敵の朜氎艊の怜玢、長距離ミサむルの匟道の蚈算など。 それらを解決するために、コンピュヌタヌは実数で動䜜する必芁がありたす。実数は、ご存じのように連続䜓であり、メモリは有限です。 したがっお、この連続䜓をれロず1の有限セットにマッピングする必芁がありたす。 速床、サむズ、粟床の劥協点を求めお、科孊者は浮動小数点数たたはブルゞョアなら浮動小数点を提案したした。



䜕らかの理由で、察応するデヌタ型がすべおのプログラミング蚀語に存圚するこずを考えるず、浮動小数点挔算はコンピュヌタヌサむ゚ンスの゚キゟチックな分野ず芋なされたす。 正盎に蚀うず、CPUずGPUで同じ問題を解決しながら、私自身はコンピュヌタヌ挔算をそれほど重芖しおいたせんでしたが、結果は異なりたす。 この領域の隠されたコヌナヌには、非垞に奇劙で奇劙な珟象がありたす。非可換性および非連想性の算術挔算、笊号付きれロ、䞍等号の差がれロなどです。 この氷山の根は数孊に深く入り蟌んでおり、切り口の䞋では衚面にあるものだけを抂説しようずしたす。



1.基本



敎数のセットは無限ですが、特定の問題を解決するずきに生じる敎数を衚すために、このようなビット数をい぀でも取埗できたす。 実数のセットは無限であるだけでなく連続的でもあるため、いくらいくら取るにしおも、正確な衚珟を持たない数字に遭遇するこずは避けられたせん。 浮動小数点数は、実数を衚瀺する方法の1぀です。これは、粟床ず蚱容倀の範囲の間の劥協点です。



浮動小数点数は、通垞、笊号、 指数 、順序、および仮数に分割された個別の数字のセットで構成されたす。 順序ず仮数は、笊号ずずもに、次の圢匏で浮動小数点数の衚珟を䞎える敎数です。







数孊的には、次のように曞かれおいたす。



-1 s ×M×B E 、ここでsは笊号、B-base、Eは次数、Mは仮数です。



基数は、数字の数䜓系を決定したす。 基数B = 2の浮動小数点数2進衚珟が䞞め誀差に最も耐性があるこずが数孊的に蚌明されおいるため、実際には、基数2ず、あたり䞀般的ではない10のみが発生したす。浮動小数点は次のようになりたす。



-1 s ×M×2 E



仮数ず順序ずは䜕ですか 仮数は、実数の最䞊䜍ビットを衚す固定長の敎数です。 仮数が3ビット| M | = 3で構成されおいるずしたす。 たずえば、バむナリシステムでは101 2に等しい数倀「5」を䜿甚したす。 最䞊䜍ビットは2 2 = 4に察応し、䞭倮これはれロですは2 1 = 2で、最䞋䜍ビットは2 0 = 1です。 順序は、最高ランクのベヌス2の次数です。 この䟋では、E = 2です。 このような数倀は、たずえば「1.01e + 2」など、いわゆる「科孊的」暙準圢匏で蚘述するず䟿利です。 仮数が3文字で構成され、順序が2であるこずはすぐにわかりたす。



仮数の同じ3ビットを䜿甚しお小数を取埗するずしたす。 たずえば、E = 1の堎合、これを行うこずができたす。 その埌、私たちの数は等しくなりたす



1.01e + 1 = 1×2 1 + 0×2 0 + 1×2 -1 = 2 + 0.5 = 2.5



ここでは、E = 1なので、最初の桁の2のべき乗小数点の前に来るは「1」です。 右偎小数点以䞋にある他の2぀の攟電は、2 E-1ず2 E-2 それぞれ2 0ず2 -1 の寄䞎を提䟛したす。 明らかに、Eを調敎するこずにより、同じ数を異なる方法で衚すこずができたす。 仮数の長さ| M | = 4の䟋を考えおみたしょう。 番号「2」は次のように衚すこずができたす。



2 = 10バむナリ= 1.000e + 1 = 0.100e + 2 = 0.010e + 3。 E = 1、E = 2、E = 3



同じ番号には耇数の衚珟があるこずに泚意しおください。 これは、機噚にずっおは䟿利ではありたせん。 数倀を比范するずき、およびそれらに察しお算術挔算を実行するずきは、衚珟の倚様性を考慮する必芁がありたす。 さらに、これは、衚珟の数が有限であり、繰り返しはたったく衚珟できる数の数を枛らすため、経枈的ではありたせん。 したがっお、すでに非垞に最初のマシンで、圌らはトリックを䜿甚し始め、仮数郚の最初のビットを垞に正にしたした。 このようなプレれンテヌションは、 normalizedず呌ばれおいたした 。







暗黙的なナニットをメモリに保存する必芁がないため、これにより1ビットが節玄され、数倀の䞀意の衚珟が提䟛されたす。 この䟋では、「2」には単䞀の正芏化衚珟「1.000e + 1」があり、仮数は「000」ずしおメモリに保存されたす。 䞊䜍ナニットは暗黙的に暗瀺されたす。 しかし、数倀の正芏化された衚珟では、新しい問題が発生したす-この圢匏でれロを衚珟するこずは䞍可胜です。



厳密に蚀えば、正芏化された数倀の圢匏は次のずおりです。



-1 s ×1.M×2 E.



問題解決の質は、浮動小数点数の衚珟の遞択に倧きく䟝存したす。 このようなビュヌを暙準化する問題にスムヌズに取り組みたした。



2.少しの歎史



60幎代および70幎代には、浮動小数点数、䞞め方法、および算術挔算を衚す単䞀の暙準がありたせんでした。 その結果、プログラムは非垞にポヌタブルではありたせんでした。 しかし、さらに倧きな問題は、さたざたなコンピュヌタヌに「奇劙な」芁玠があり、プログラムでそれらを認識しお考慮する必芁があるこずでした。 たずえば、2぀の異なる数倀の差はれロを返したした。 その結果、匏「X = Y」ず「XY = 0」が競合したした。 職人は、問題を避けるために乗算ず陀算の操䜜の前に割り圓お「X =XX+ X」を行うなど、非垞にトリッキヌなトリックでこの問題を回避したした。



浮動小数点数の衚珟のための単䞀の暙準を䜜成するずいうむニシアチブは、1976幎にIntelが8086およびi432の新しいコプロセッサ甚の「最適な」算術挔算を開発しようずする詊みず䞀臎したした。 この分野の科孊クゞラ、教授。 ゞョン・パヌマヌずりィリアム・カヌハン。 埌者は圌のむンタビュヌで、Intelが算術挔算を開発しおいた真剣さにより、他の䌁業が団結しお暙準化プロセスを開始するこずを䜙儀なくしたず述べたした。



誰もが真剣でした。なぜなら、あなたのアヌキテクチャを促進し、それを暙準にするこずは非垞に有益だからです。 圌らの提案は、モトロヌラのZilogのNational SuperconductorのDECによっお提瀺されたした。 メむンフレヌムのメヌカヌであるCrayずIBMは、傍芳者の目から芋おいた。 Intelはもちろん、新しい算術挔算も導入したした。 提案された仕様の䜜成者は、William Kahan、Jerome Kunen、Harold Stoneであり、圌らの提案はすぐに「KCS」ず呌ばれたした。



すぐに、DECのVAXずIntelの「KCS」の2぀を陀いお、すべおのオファヌが拒吊されたした。 VAX仕様ははるかに単玔で、PDP-11コンピュヌタヌに既に実装されおおり、そのパフォヌマンスを最倧限に匕き出す方法が明確でした。 䞀方、KCSには、「特別な」数字や「非正芏化された」数字など、倚くの䟿利な機胜が含たれおいたした詳现は以䞋。



「KCS」では、すべおの算術アルゎリズムが厳密に定矩されおおり、実装では結果がそれらに䞀臎する必芁がありたす。 これにより、この仕様のフレヌムワヌク内で厳密な蚈算を衚瀺できたす。 数孊者が数倀的方法で問題を解決するために䜿甚し、解の特性を蚌明した堎合、これらの特性がプログラムに保存されるずいう保蚌はありたせんでした。 KCS挔算の厳密さにより、浮動小数点挔算に基づいた定理を蚌明するこずができたした。



DECは、仕様を暙準にするためにあらゆるこずを行っおいたす。 圌女は、KCS算術挔算が原則ずしおDECず同じパフォヌマンスを達成できなかったずいう評刀の高い科孊者の支持を求めたした。 皮肉なこずに、Intelは仕様を生産的にする方法を知っおいたしたが、これらのトリックは䌁業秘密でした。 Intelが秘密を認めず、秘密の䞀郚を明らかにしなかった堎合、DECの猛攻撃を封じ蟌めるこずはできなかったでしょう。



暙準化の戊いの詳现に぀いおは、 Kahan教授のむンタビュヌを参照しおください。浮動小数点数の衚珟がどのように芋えるかを芋おいきたす。



3.今日の浮動小数点数のプレれンテヌション



KCS開発者が勝ち、珟圚、その子孫はIEEE754暙準に組み蟌たれおいたす。 その䞭の浮動小数点数は、次のように笊号s、仮数M、および順序Eの圢匏で衚瀺されたす。



-1 s ×1.M×2 E



発蚀。 新しいIEE754-2008暙準では、2を底ずする数倀に加えお、10を底ずする数倀、いわゆる10進浮動小数点数がありたす。



Wikipediaで芋぀けられる過剰な情報で読者を混乱させないために、単粟床浮動の1぀のデヌタ型のみを考慮したす。 半粟床、倍粟床、拡匵粟床の数倀は同じ機胜を持ちたすが、順序ず仮数の範囲が異なりたす。 単粟床数浮動/単粟床では、順序は8ビットで構成され、仮数は23です。有効な順序はE-127ずしお定矩されたす。 たずえば、0.15625ずいう数倀はメモリに次のように曞き蟌たれたす。





りィキペディアからの図。



この䟋では



もう少し詳现な説明
ここでは、数倀「101」のバむナリ衚珟を凊理し、巊に数桁シフトしたす。 1.01はバむナリ衚珟であり、1×2 0 + 0×2 -1 + 1×2 -2を意味したす。 カンマを巊に3桁シフトするず、1.01e-3 = 1×2 -3 + 0×2 -4 + 1×2 -5 = 1×0.125 + 0×0.0625 + 1×0.03125 = 0.125 + 0になりたす。 、03125 = 0.15625。




3.1特別な番号れロ、無限、および䞍確実性


IEEE754では、数倀「0」はE = E min -1単䞀の堎合は-127に等しい次数ずれロ仮数の倀で衚されたす。 独立した数倀ずしおれロを導入するず正芏化された衚珟ではれロを衚珟できないため、算術の倚くの奇劙な問題を回避できたした。 たた、れロの操䜜は個別に凊理する必芁がありたすが、通垞は通垞の数倀よりも高速に実行されたす。



たた、IEEE754は特別な番号の衚珟を提䟛し、その操䜜は䟋倖を匕き起こしたす。 これらの数倀には、無限倧±∞ず䞍確実性NaNが含たれたす。 これらの数倀により、オヌバヌフロヌ時に適切な倀を返すこずができたす。 無限倧は、E = E max +1の次数ずれロ仮数を持぀数倀ずしお衚されたす。 オヌバヌフロヌおよびれロ以倖の数倀をれロで陀算するこずにより、無限倧を取埗できたす。 開発者は、配圓ず陀数が特定の数になる傟向がある堎合、限界の存圚に基づいお郚門の無限倧を決定したした。 したがっお、c / 0 ==±∞たずえば、3/0 = +∞、および-3 / 0 =-∞。これは、被陀数が定数になり、陀数がれロになる堎合、制限が無限になるためです。 0/0では、制限は存圚しないため、結果は䞍確実になりたす。



䞍確実性たたはNaN非数倀からは、算術挔算が垞に䜕らかの意味のない倀を返すこずができるように考案された衚珟です。 IEEE754では、NaNはE = E max +1の数倀ずしお衚され、仮数はれロではありたせん。 NaNを䜿甚した操䜜は、NaNを返したす。 必芁に応じお、プログラムが解釈できる仮数郚に情報を曞き蟌むこずができたす。 これは芏栌では指定されおおらず、仮数はほずんどの堎合無芖されたす。



NaNを入手するにはどうすればよいですか 次のいずれかの方法で



定矩䞊、NaN≠NaNです。したがっお、倉数の倀を確認するには、それを自分で比范するだけです。



なぜれロ蚘号たたは+0察-0


奜奇心reader盛な読者は、浮動小数点数の蚘述衚珟に笊号のみが異なる2぀のれロがあるこずに気づいたず思いたす。 したがっお、3・+0= + 0、および3・-0=-0です。 ただし、+ 0 = -0を比范する堎合。 暙準では、笊号は意図的に保持されたため、乗算たたは陀算の際にオヌバヌフロヌたたは有意性の喪倱の結果ずしお無限たたはれロになる匏は、䟝然ずしお最も正しい結果を提䟛できたす。 たずえば、れロに笊号がなかった堎合、1 / =∞ず1 /-∞は0であるため、x =±∞の堎合、匏1 /1 / x= xは真になりたせん。



別の䟋

+∞/ 0+∞= +∞、䞀方で+∞/ -0+∞= NaN



この堎合、無限倧はNaNよりどのように優れおいたすか NaNが算術匏に珟れる堎合、匏党䜓の結果は垞にNaNになるずいう事実。 匏で無限が怜出された堎合、結果はれロ、無限、たたは通垞の浮動小数点数になりたす。 たずえば、1 /∞= 0。



3.3非正芏化数


非正芏非正芏化非正芏数ずは、簡単な䟋を考えおみたしょう。 仮数の長さ| M | = 2ビット+ 1ビットの正芏化ず-1≀E≀2のオヌダヌの倀の範囲を持぀正芏化衚珟を考えおみたしょう。 この堎合、16個の数字を取埗したす。







倧きなストロヌクは、1.00の仮数を持぀数字を瀺したす。 れロから最も近い数倀0-0.5たでの距離は、この数倀から次の数倀0.5-0.625たでの距離よりも倧きいこずがわかりたす。 ぀たり、0.5から1たでの任意の2぀の数倀の差は、これらの数倀が等しくなくおも0になりたす。 さらに悪いこずに、1より倧きい数の差は0.5ず0の間のギャップに入りたす。たずえば、「1.5-1.25 = 0」です図を参照。



すべおのプログラムが「れロに近い穎」に陥るわけではありたせん。 70幎代の統蚈によるず、平均しお、各コンピュヌタヌは月に䞀床この問題に遭遇したした。 コンピュヌタヌが倧衆化したこずを考えるず、KCS開発者はこの問題をハヌドりェアレベルで解決するのに十分なほど深刻だず考えたした。 圌らが提案した解決策は次のずおりでした。 E = E min -1フロヌトの堎合は「-127」および仮数がれロの堎合、数倀はれロに等しいず芋なされたす。 仮数がれロでない堎合、数倀は非れロずみなされ、その順序はE = E minであるず想定され、仮数の暗黙的な䞊䜍ビットはれロに蚭定されたす。 このような数倀は非正芏化ず呌ばれたす。



厳密に蚀えば、浮動小数点数は次のようになりたす。



-1E min≀E≀Emaxの堎合、 s ×1.M×2 E 正芏化数



-1 s × 0。E = E min -1の堎合、M×2 Emin 。 非正芏化数



䟋に戻りたしょう。 E min = -1 新しい順序倀E = -2を導入したす。この堎合、数倀は非正芏化されたす。 その結果、数倀の新しい衚珟が埗られたす。







0から0.5の間隔は非正芏化された数倀で埋められ、䞊蚘の0の䟋0.5-0.25および1.5-1.25で倱敗しないようにするこずができたす。 これにより、れロに近い数倀の䞞め誀差に察しおビュヌがより堅牢になりたした。



しかし、プロセッサで数倀の非正芏化衚珟を䜿甚する莅沢は無料では提䟛されたせん。 そのような数はすべおの算術挔算で異なる方法で凊理する必芁があるずいう事実により、そのような算術での䜜業を効果的にするこずは困難です。 これにより、プロセッサでのALUの実装にさらに困難が生じたす。 非正芏化された数倀は非垞に䟿利ですが、䞇胜薬ではなく、れロぞの䞞めを远跡する必芁がありたす。 したがっお、この機胜は暙準の開発においお障害ずなり、最も匷い抵抗に䌚いたした。



3.4 IEEE754の番号シヌケンス


IEEE754圢匏で数倀を衚珟する驚くべき機胜の1぀は、順序ず仮数が、実行される敎数{n}のシヌケンスを圢成するように次々に配眮されるこずです。



n <n + 1⇒Fn<Fn + 1。ここで、Fnは敎数nからビットを順序ず仮数に分割するこずにより圢成される浮動小数点数です。



したがっお、正の浮動小数点数を取埗しお敎数に倉換し、「1」を远加するず、この算術で衚珟可胜な次の数が埗られたす。 Cでは、これは次のように実行できたす。



float a=0.5; int n = *((int*) &a); float b = *((float*) &(++n)); printf(" %e  : %e,  (%e)\n", a, b, ba);
      
      





このコヌドは、32ビット敎数のアヌキテクチャでのみ機胜したす。



4.浮動小数点挔算の萜ずし穎



今すぐ緎習したす。 プログラミング時には特に泚意する必芁がある浮動小数点挔算の機胜を怜蚎しおください。



4.1䞞め


特に倍粟床を䜿甚しおいる堎合は、最新の浮動小数点挔算の䞞め誀差による゚ラヌに察凊するこずは困難です。 IEEE754芏栌の䞞め芏則では、算術挔算の結果は、正確な倀で実行され、この圢匏で衚される最も近い数倀に䞞められるかのようになりたす。 これにはALUからの远加の努力が必芁であり、䞀郚のコンパむラオプションgccの「-ffast-math」などはこの動䜜を無効にする堎合がありたす。 IEEE754の䞞めの機胜



4.2非連想算術挔算


浮動小数点挔算では、ルヌルa * b* c = a *b * cは算術挔算には適甚されたせん。 䟋えば



10 20 +1-10 20 = 0≠10 20 -10 20 + 1 = 1



数倀を合蚈するプログラムがあるずしたす。



 double s = 0.0; for (int i=0; i<n; i++) s = s + t[i];
      
      





䞀郚のコンパむラは、デフォルトで、耇数のALUを同時に䜿甚するようにコヌドを曞き換えるこずができたすnを2で割るず仮定したす。



 double sa[2], s; sa[0]=sa[1]=0.0; for (int i=0; i<n/2; i++) {    sa[0]=sa[0]+t[i*2+0];    sa[1]=sa[1]+t[i*2+1]; } S=sa[0]+sa[1];
      
      





加算の操䜜は連想的ではないため、これらの2぀のプログラムは異なる結果を生成する可胜性がありたす。



4.3数倀定数


すべおの10進数に2進浮動小数点衚珟があるわけではないこずに泚意しおください。 たずえば、数倀「0.2」は単粟床で「0.200000003」ずしお衚されたす。 したがっお、「0.2 + 0.2≈0.4」。 別の絶察誀差

ケヌスは高くないかもしれたせんが、サむクルでそのような定数を䜿甚するず、环積゚ラヌを取埗できたす。



4.4最䜎2぀の倀の遞択


最小倀を遞択する必芁がある2぀の倀があるずしたす。 Cでは、これは次のいずれかの方法で実行できたす。

  1. x <y xy
  2. x <= y xy
  3. x> y yx
  4. x> = y yx


倚くの堎合、コンパむラは1぀のプロセッサ呜什で実行されるため、これらを同等ず芋なし、垞に最初のオプションを䜿甚したす。 ただし、±0ずNaNを考慮するず、これらの挔算はどのような意味でも同等ではありたせん。

x y x <y xy x <= y xy x> y yx x> = y yx
+0 -0 -0 +0 +0 -0
ナン 1 1 1 ナン ナン


4.5数倀の比范


浮動小数点数を凊理するずきに非垞に䞀般的な゚ラヌは、同等性をチェックするずきに発生したす。 䟋えば



 float fValue = 0.2; if (fValue == 0.2) DoStuff();
      
      





ここでの間違いは、0.2は正確なバむナリ衚珟を持たないこずです。次に、0.2は倍粟床の定数であり、倉数fValueは単䞀であり、この比范の動䜜に぀いおの保蚌はありたせん。



最良の、しかしただ間違った方法は、差を蚱容絶察誀差ず比范するこずです



 if (fabs(fValue – fExpected) < 0.0001) DoStuff(); // fValue=fExpected?
      
      







このアプロヌチの欠点は、この数倀自䜓の増加に䌎い、数倀を衚す゚ラヌが増加するこずです。 したがっお、プログラムが「10000」を予期しおいる堎合、䞊蚘の等匏は最も近い隣接番号10000,000977に぀いおは満たされたせん。 これは、プログラムが単粟床から倍粟床ぞの倉換を行う堎合に特に圓おはたりたす。



適切な比范手順を遞択するのは難しく、興味のある読者です。 ブルヌス・ドヌ゜ンの蚘事を参照しおください。 浮動小数点数ず敎数倉数ぞの倉換を比范するこずを提案しおいたす。 これは、移怍性のある方法ではありたせんが、最高です。



 bool AlmostEqual2sComplement(float A, float B, int maxUlps) {    // maxUlps        ,     // NaN          assert(maxUlps > 0 && maxUlps < 4 * 1024 * 1024);    int aInt = *(int*)&A;    //    aInt,  ,         if (aInt < 0) aInt = 0x80000000 - aInt;    //aInt &= 0x7fffffff; //(.   Vayun)    //   bInt    int bInt = *(int*)&B;    if (bInt < 0) bInt = 0x80000000 - bInt;    /*aInt &= 0x7fffffff;*/    unsigned int intDiff = abs(aInt - bInt); /*(.   Vayun)*/    if (intDiff <= maxUlps)        return true;    return false; }
      
      







このプログラムでは、maxUlpsUnits-In-Last-Placeからは、チェック倀ず期埅倀の間にある浮動小数点数の最倧数です。 この倉数のもう1぀の意味は、比范察象の数字の2進数最䞋䜍から始たるの数を逃すこずです。 たずえば、maxUlps = 16は、䞋䜍4ビットlog 2 16が䞀臎しない可胜性があるこずを意味し、数倀は䟝然ずしお等しいず芋なされたす。 さらに、数倀10000ず比范するず、絶察誀差は0.0146に等しくなり、0.001ず比范するず、誀差は0.0000000110 -8 未満になりたす。



5. IEE754のサポヌトの完党性を確認したす



プロセッサがIEEE754暙準に完党に準拠しおいる堎合、暙準デヌタ型Cのfloat / doubleなどを䜿甚するプログラムは、異なるコンピュヌタヌで同じ結果を生成するず思いたすか あなたは間違っおいたす。 移怍性ずコンプラむアンスは、コンパむラず最適化オプションの圱響を受けたす。 William KahanはCFortranのバヌゞョンがありたすでプログラムを䜜成したした。これにより、IEEE754のリンク「アヌキテクチャ+コンパむラ+オプション」かどうかを確認できたす。 「浮動小数点パラノむア」ず呌ばれ、その゜ヌスコヌドはダりンロヌドできたす 。 同様のプログラムがGPUで利甚可胜です。 そのため、たずえば、Intelコンパむラiccはデフォルトで「緩和された」IEEE754モデルを䜿甚するため、すべおのテストが実行されるわけではありたせん。 オプション「-fp-model precise」を䜿甚するず、暙準に厳密に準拠しおプログラムをコンパむルできたす。 GCCコンパむラには「-ffast-math」オプションがあり、これを䜿甚するずIEEE754の䞍䞀臎が発生したす。



おわりに



最埌に、有益な物語。 GPUでテストプロゞェクトに取り組んでいたずき、1぀のプログラムのシリアルバヌゞョンずパラレルバヌゞョンがありたした。 ランタむムを比范するず、300倍の加速が埗られたため非垞に満足しおいたす。 しかし埌になっお、GPUでの蚈算は「厩れ」、NaNに倉わり、GPUでの蚈算は通垞の数倀よりも高速であるこずが刀明したした。 もう1぀興味深いのは、GPU゚ミュレヌタヌCPU䞊の同じプログラムが正しい結果を生成したが、GPU自䜓ではなかったこずです。 その埌、このGPUがIEEE754暙準を完党にサポヌトしおおらず、盎接的なアプロヌチが機胜しなかったこずが問題であるこずが刀明したした。



珟圚、浮動小数点挔算はほが完璧です。 ほずんどの堎合、玠朎なアプロヌチが機胜し、すべおの機胜を考慮しおいないプログラムは正しい結果をもたらしたす。たた、蚘茉されおいる萜ずし穎ぱキゟチックなケヌスのみに関係したす。 しかし、垞に譊戒しなければなりたせん。コンピュヌタヌ数孊などの問題では、熊手を螏むのは簡単です。



PS重芁な点に぀いおはuqlockに感謝したす。 お金を浮動小数点数ずしお保存するこずはできたせん。 この堎合、重芁なカテゎリを区別できたせん。 プログラミング蚀語に固定小数点デヌタ型がない堎合、状況から抜け出し、お金を敎数ずしお保存できたす。これは、ペニヌ堎合によっおはペニヌの䞀郚を意味したす。



PPSナヌザヌに誀怍ず゚ラヌを発芋したした gribozavr 、 kurokikaze 、 Cenness 、 TheShock 、 perl_demon 、 GordTremor 、 fader44 、 DraculaDis 、 icc 、 f0rbidik 、 Harkonnen 、 AlexanderYastrebov 、 Vayun 、 EvilsInterrupt 



文孊


  1. IEE754暙準の開発に関するWilliam Kahanぞのむンタビュヌ 。
  2. すべおのコンピュヌタヌ科孊者が浮動小数点挔算に぀いお知っおおくべきこず、David Goldberg-数孊蚈算の本。
  3. 浮動小数点数の比范、ブルヌス・ダり゜ン 。



All Articles