APFloatTest.cpp 147 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880
  1. //===- llvm/unittest/ADT/APFloat.cpp - APFloat unit tests ---------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "llvm/ADT/APFloat.h"
  10. #include "llvm/ADT/APSInt.h"
  11. #include "llvm/ADT/SmallString.h"
  12. #include "llvm/ADT/SmallVector.h"
  13. #include "llvm/Support/raw_ostream.h"
  14. #include "gtest/gtest.h"
  15. #include <cmath>
  16. #include <ostream>
  17. #include <string>
  18. using namespace llvm;
  19. static double convertToDoubleFromString(const char *Str) {
  20. llvm::APFloat F(0.0);
  21. F.convertFromString(Str, llvm::APFloat::rmNearestTiesToEven);
  22. return F.convertToDouble();
  23. }
  24. static std::string convertToString(double d, unsigned Prec, unsigned Pad) {
  25. llvm::SmallVector<char, 100> Buffer;
  26. llvm::APFloat F(d);
  27. F.toString(Buffer, Prec, Pad);
  28. return std::string(Buffer.data(), Buffer.size());
  29. }
  30. namespace {
  31. TEST(APFloatTest, isSignaling) {
  32. // We test qNaN, -qNaN, +sNaN, -sNaN with and without payloads. *NOTE* The
  33. // positive/negative distinction is included only since the getQNaN/getSNaN
  34. // API provides the option.
  35. APInt payload = APInt::getOneBitSet(4, 2);
  36. EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle, false).isSignaling());
  37. EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle, true).isSignaling());
  38. EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle, false, &payload).isSignaling());
  39. EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle, true, &payload).isSignaling());
  40. EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle, false).isSignaling());
  41. EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle, true).isSignaling());
  42. EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle, false, &payload).isSignaling());
  43. EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle, true, &payload).isSignaling());
  44. }
  45. TEST(APFloatTest, next) {
  46. APFloat test(APFloat::IEEEquad, APFloat::uninitialized);
  47. APFloat expected(APFloat::IEEEquad, APFloat::uninitialized);
  48. // 1. Test Special Cases Values.
  49. //
  50. // Test all special values for nextUp and nextDown perscribed by IEEE-754R
  51. // 2008. These are:
  52. // 1. +inf
  53. // 2. -inf
  54. // 3. getLargest()
  55. // 4. -getLargest()
  56. // 5. getSmallest()
  57. // 6. -getSmallest()
  58. // 7. qNaN
  59. // 8. sNaN
  60. // 9. +0
  61. // 10. -0
  62. // nextUp(+inf) = +inf.
  63. test = APFloat::getInf(APFloat::IEEEquad, false);
  64. expected = APFloat::getInf(APFloat::IEEEquad, false);
  65. EXPECT_EQ(test.next(false), APFloat::opOK);
  66. EXPECT_TRUE(test.isInfinity());
  67. EXPECT_TRUE(!test.isNegative());
  68. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  69. // nextDown(+inf) = -nextUp(-inf) = -(-getLargest()) = getLargest()
  70. test = APFloat::getInf(APFloat::IEEEquad, false);
  71. expected = APFloat::getLargest(APFloat::IEEEquad, false);
  72. EXPECT_EQ(test.next(true), APFloat::opOK);
  73. EXPECT_TRUE(!test.isNegative());
  74. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  75. // nextUp(-inf) = -getLargest()
  76. test = APFloat::getInf(APFloat::IEEEquad, true);
  77. expected = APFloat::getLargest(APFloat::IEEEquad, true);
  78. EXPECT_EQ(test.next(false), APFloat::opOK);
  79. EXPECT_TRUE(test.isNegative());
  80. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  81. // nextDown(-inf) = -nextUp(+inf) = -(+inf) = -inf.
  82. test = APFloat::getInf(APFloat::IEEEquad, true);
  83. expected = APFloat::getInf(APFloat::IEEEquad, true);
  84. EXPECT_EQ(test.next(true), APFloat::opOK);
  85. EXPECT_TRUE(test.isInfinity() && test.isNegative());
  86. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  87. // nextUp(getLargest()) = +inf
  88. test = APFloat::getLargest(APFloat::IEEEquad, false);
  89. expected = APFloat::getInf(APFloat::IEEEquad, false);
  90. EXPECT_EQ(test.next(false), APFloat::opOK);
  91. EXPECT_TRUE(test.isInfinity() && !test.isNegative());
  92. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  93. // nextDown(getLargest()) = -nextUp(-getLargest())
  94. // = -(-getLargest() + inc)
  95. // = getLargest() - inc.
  96. test = APFloat::getLargest(APFloat::IEEEquad, false);
  97. expected = APFloat(APFloat::IEEEquad,
  98. "0x1.fffffffffffffffffffffffffffep+16383");
  99. EXPECT_EQ(test.next(true), APFloat::opOK);
  100. EXPECT_TRUE(!test.isInfinity() && !test.isNegative());
  101. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  102. // nextUp(-getLargest()) = -getLargest() + inc.
  103. test = APFloat::getLargest(APFloat::IEEEquad, true);
  104. expected = APFloat(APFloat::IEEEquad,
  105. "-0x1.fffffffffffffffffffffffffffep+16383");
  106. EXPECT_EQ(test.next(false), APFloat::opOK);
  107. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  108. // nextDown(-getLargest()) = -nextUp(getLargest()) = -(inf) = -inf.
  109. test = APFloat::getLargest(APFloat::IEEEquad, true);
  110. expected = APFloat::getInf(APFloat::IEEEquad, true);
  111. EXPECT_EQ(test.next(true), APFloat::opOK);
  112. EXPECT_TRUE(test.isInfinity() && test.isNegative());
  113. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  114. // nextUp(getSmallest()) = getSmallest() + inc.
  115. test = APFloat(APFloat::IEEEquad, "0x0.0000000000000000000000000001p-16382");
  116. expected = APFloat(APFloat::IEEEquad,
  117. "0x0.0000000000000000000000000002p-16382");
  118. EXPECT_EQ(test.next(false), APFloat::opOK);
  119. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  120. // nextDown(getSmallest()) = -nextUp(-getSmallest()) = -(-0) = +0.
  121. test = APFloat(APFloat::IEEEquad, "0x0.0000000000000000000000000001p-16382");
  122. expected = APFloat::getZero(APFloat::IEEEquad, false);
  123. EXPECT_EQ(test.next(true), APFloat::opOK);
  124. EXPECT_TRUE(test.isZero() && !test.isNegative());
  125. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  126. // nextUp(-getSmallest()) = -0.
  127. test = APFloat(APFloat::IEEEquad, "-0x0.0000000000000000000000000001p-16382");
  128. expected = APFloat::getZero(APFloat::IEEEquad, true);
  129. EXPECT_EQ(test.next(false), APFloat::opOK);
  130. EXPECT_TRUE(test.isZero() && test.isNegative());
  131. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  132. // nextDown(-getSmallest()) = -nextUp(getSmallest()) = -getSmallest() - inc.
  133. test = APFloat(APFloat::IEEEquad, "-0x0.0000000000000000000000000001p-16382");
  134. expected = APFloat(APFloat::IEEEquad,
  135. "-0x0.0000000000000000000000000002p-16382");
  136. EXPECT_EQ(test.next(true), APFloat::opOK);
  137. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  138. // nextUp(qNaN) = qNaN
  139. test = APFloat::getQNaN(APFloat::IEEEquad, false);
  140. expected = APFloat::getQNaN(APFloat::IEEEquad, false);
  141. EXPECT_EQ(test.next(false), APFloat::opOK);
  142. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  143. // nextDown(qNaN) = qNaN
  144. test = APFloat::getQNaN(APFloat::IEEEquad, false);
  145. expected = APFloat::getQNaN(APFloat::IEEEquad, false);
  146. EXPECT_EQ(test.next(true), APFloat::opOK);
  147. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  148. // nextUp(sNaN) = qNaN
  149. test = APFloat::getSNaN(APFloat::IEEEquad, false);
  150. expected = APFloat::getQNaN(APFloat::IEEEquad, false);
  151. EXPECT_EQ(test.next(false), APFloat::opInvalidOp);
  152. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  153. // nextDown(sNaN) = qNaN
  154. test = APFloat::getSNaN(APFloat::IEEEquad, false);
  155. expected = APFloat::getQNaN(APFloat::IEEEquad, false);
  156. EXPECT_EQ(test.next(true), APFloat::opInvalidOp);
  157. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  158. // nextUp(+0) = +getSmallest()
  159. test = APFloat::getZero(APFloat::IEEEquad, false);
  160. expected = APFloat::getSmallest(APFloat::IEEEquad, false);
  161. EXPECT_EQ(test.next(false), APFloat::opOK);
  162. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  163. // nextDown(+0) = -nextUp(-0) = -getSmallest()
  164. test = APFloat::getZero(APFloat::IEEEquad, false);
  165. expected = APFloat::getSmallest(APFloat::IEEEquad, true);
  166. EXPECT_EQ(test.next(true), APFloat::opOK);
  167. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  168. // nextUp(-0) = +getSmallest()
  169. test = APFloat::getZero(APFloat::IEEEquad, true);
  170. expected = APFloat::getSmallest(APFloat::IEEEquad, false);
  171. EXPECT_EQ(test.next(false), APFloat::opOK);
  172. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  173. // nextDown(-0) = -nextUp(0) = -getSmallest()
  174. test = APFloat::getZero(APFloat::IEEEquad, true);
  175. expected = APFloat::getSmallest(APFloat::IEEEquad, true);
  176. EXPECT_EQ(test.next(true), APFloat::opOK);
  177. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  178. // 2. Binade Boundary Tests.
  179. // 2a. Test denormal <-> normal binade boundaries.
  180. // * nextUp(+Largest Denormal) -> +Smallest Normal.
  181. // * nextDown(-Largest Denormal) -> -Smallest Normal.
  182. // * nextUp(-Smallest Normal) -> -Largest Denormal.
  183. // * nextDown(+Smallest Normal) -> +Largest Denormal.
  184. // nextUp(+Largest Denormal) -> +Smallest Normal.
  185. test = APFloat(APFloat::IEEEquad, "0x0.ffffffffffffffffffffffffffffp-16382");
  186. expected = APFloat(APFloat::IEEEquad,
  187. "0x1.0000000000000000000000000000p-16382");
  188. EXPECT_EQ(test.next(false), APFloat::opOK);
  189. EXPECT_FALSE(test.isDenormal());
  190. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  191. // nextDown(-Largest Denormal) -> -Smallest Normal.
  192. test = APFloat(APFloat::IEEEquad,
  193. "-0x0.ffffffffffffffffffffffffffffp-16382");
  194. expected = APFloat(APFloat::IEEEquad,
  195. "-0x1.0000000000000000000000000000p-16382");
  196. EXPECT_EQ(test.next(true), APFloat::opOK);
  197. EXPECT_FALSE(test.isDenormal());
  198. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  199. // nextUp(-Smallest Normal) -> -LargestDenormal.
  200. test = APFloat(APFloat::IEEEquad,
  201. "-0x1.0000000000000000000000000000p-16382");
  202. expected = APFloat(APFloat::IEEEquad,
  203. "-0x0.ffffffffffffffffffffffffffffp-16382");
  204. EXPECT_EQ(test.next(false), APFloat::opOK);
  205. EXPECT_TRUE(test.isDenormal());
  206. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  207. // nextDown(+Smallest Normal) -> +Largest Denormal.
  208. test = APFloat(APFloat::IEEEquad,
  209. "+0x1.0000000000000000000000000000p-16382");
  210. expected = APFloat(APFloat::IEEEquad,
  211. "+0x0.ffffffffffffffffffffffffffffp-16382");
  212. EXPECT_EQ(test.next(true), APFloat::opOK);
  213. EXPECT_TRUE(test.isDenormal());
  214. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  215. // 2b. Test normal <-> normal binade boundaries.
  216. // * nextUp(-Normal Binade Boundary) -> -Normal Binade Boundary + 1.
  217. // * nextDown(+Normal Binade Boundary) -> +Normal Binade Boundary - 1.
  218. // * nextUp(+Normal Binade Boundary - 1) -> +Normal Binade Boundary.
  219. // * nextDown(-Normal Binade Boundary + 1) -> -Normal Binade Boundary.
  220. // nextUp(-Normal Binade Boundary) -> -Normal Binade Boundary + 1.
  221. test = APFloat(APFloat::IEEEquad, "-0x1p+1");
  222. expected = APFloat(APFloat::IEEEquad,
  223. "-0x1.ffffffffffffffffffffffffffffp+0");
  224. EXPECT_EQ(test.next(false), APFloat::opOK);
  225. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  226. // nextDown(+Normal Binade Boundary) -> +Normal Binade Boundary - 1.
  227. test = APFloat(APFloat::IEEEquad, "0x1p+1");
  228. expected = APFloat(APFloat::IEEEquad, "0x1.ffffffffffffffffffffffffffffp+0");
  229. EXPECT_EQ(test.next(true), APFloat::opOK);
  230. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  231. // nextUp(+Normal Binade Boundary - 1) -> +Normal Binade Boundary.
  232. test = APFloat(APFloat::IEEEquad, "0x1.ffffffffffffffffffffffffffffp+0");
  233. expected = APFloat(APFloat::IEEEquad, "0x1p+1");
  234. EXPECT_EQ(test.next(false), APFloat::opOK);
  235. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  236. // nextDown(-Normal Binade Boundary + 1) -> -Normal Binade Boundary.
  237. test = APFloat(APFloat::IEEEquad, "-0x1.ffffffffffffffffffffffffffffp+0");
  238. expected = APFloat(APFloat::IEEEquad, "-0x1p+1");
  239. EXPECT_EQ(test.next(true), APFloat::opOK);
  240. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  241. // 2c. Test using next at binade boundaries with a direction away from the
  242. // binade boundary. Away from denormal <-> normal boundaries.
  243. //
  244. // This is to make sure that even though we are at a binade boundary, since
  245. // we are rounding away, we do not trigger the binade boundary code. Thus we
  246. // test:
  247. // * nextUp(-Largest Denormal) -> -Largest Denormal + inc.
  248. // * nextDown(+Largest Denormal) -> +Largest Denormal - inc.
  249. // * nextUp(+Smallest Normal) -> +Smallest Normal + inc.
  250. // * nextDown(-Smallest Normal) -> -Smallest Normal - inc.
  251. // nextUp(-Largest Denormal) -> -Largest Denormal + inc.
  252. test = APFloat(APFloat::IEEEquad, "-0x0.ffffffffffffffffffffffffffffp-16382");
  253. expected = APFloat(APFloat::IEEEquad,
  254. "-0x0.fffffffffffffffffffffffffffep-16382");
  255. EXPECT_EQ(test.next(false), APFloat::opOK);
  256. EXPECT_TRUE(test.isDenormal());
  257. EXPECT_TRUE(test.isNegative());
  258. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  259. // nextDown(+Largest Denormal) -> +Largest Denormal - inc.
  260. test = APFloat(APFloat::IEEEquad, "0x0.ffffffffffffffffffffffffffffp-16382");
  261. expected = APFloat(APFloat::IEEEquad,
  262. "0x0.fffffffffffffffffffffffffffep-16382");
  263. EXPECT_EQ(test.next(true), APFloat::opOK);
  264. EXPECT_TRUE(test.isDenormal());
  265. EXPECT_TRUE(!test.isNegative());
  266. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  267. // nextUp(+Smallest Normal) -> +Smallest Normal + inc.
  268. test = APFloat(APFloat::IEEEquad, "0x1.0000000000000000000000000000p-16382");
  269. expected = APFloat(APFloat::IEEEquad,
  270. "0x1.0000000000000000000000000001p-16382");
  271. EXPECT_EQ(test.next(false), APFloat::opOK);
  272. EXPECT_TRUE(!test.isDenormal());
  273. EXPECT_TRUE(!test.isNegative());
  274. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  275. // nextDown(-Smallest Normal) -> -Smallest Normal - inc.
  276. test = APFloat(APFloat::IEEEquad, "-0x1.0000000000000000000000000000p-16382");
  277. expected = APFloat(APFloat::IEEEquad,
  278. "-0x1.0000000000000000000000000001p-16382");
  279. EXPECT_EQ(test.next(true), APFloat::opOK);
  280. EXPECT_TRUE(!test.isDenormal());
  281. EXPECT_TRUE(test.isNegative());
  282. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  283. // 2d. Test values which cause our exponent to go to min exponent. This
  284. // is to ensure that guards in the code to check for min exponent
  285. // trigger properly.
  286. // * nextUp(-0x1p-16381) -> -0x1.ffffffffffffffffffffffffffffp-16382
  287. // * nextDown(-0x1.ffffffffffffffffffffffffffffp-16382) ->
  288. // -0x1p-16381
  289. // * nextUp(0x1.ffffffffffffffffffffffffffffp-16382) -> 0x1p-16382
  290. // * nextDown(0x1p-16382) -> 0x1.ffffffffffffffffffffffffffffp-16382
  291. // nextUp(-0x1p-16381) -> -0x1.ffffffffffffffffffffffffffffp-16382
  292. test = APFloat(APFloat::IEEEquad, "-0x1p-16381");
  293. expected = APFloat(APFloat::IEEEquad,
  294. "-0x1.ffffffffffffffffffffffffffffp-16382");
  295. EXPECT_EQ(test.next(false), APFloat::opOK);
  296. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  297. // nextDown(-0x1.ffffffffffffffffffffffffffffp-16382) ->
  298. // -0x1p-16381
  299. test = APFloat(APFloat::IEEEquad, "-0x1.ffffffffffffffffffffffffffffp-16382");
  300. expected = APFloat(APFloat::IEEEquad, "-0x1p-16381");
  301. EXPECT_EQ(test.next(true), APFloat::opOK);
  302. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  303. // nextUp(0x1.ffffffffffffffffffffffffffffp-16382) -> 0x1p-16381
  304. test = APFloat(APFloat::IEEEquad, "0x1.ffffffffffffffffffffffffffffp-16382");
  305. expected = APFloat(APFloat::IEEEquad, "0x1p-16381");
  306. EXPECT_EQ(test.next(false), APFloat::opOK);
  307. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  308. // nextDown(0x1p-16381) -> 0x1.ffffffffffffffffffffffffffffp-16382
  309. test = APFloat(APFloat::IEEEquad, "0x1p-16381");
  310. expected = APFloat(APFloat::IEEEquad,
  311. "0x1.ffffffffffffffffffffffffffffp-16382");
  312. EXPECT_EQ(test.next(true), APFloat::opOK);
  313. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  314. // 3. Now we test both denormal/normal computation which will not cause us
  315. // to go across binade boundaries. Specifically we test:
  316. // * nextUp(+Denormal) -> +Denormal.
  317. // * nextDown(+Denormal) -> +Denormal.
  318. // * nextUp(-Denormal) -> -Denormal.
  319. // * nextDown(-Denormal) -> -Denormal.
  320. // * nextUp(+Normal) -> +Normal.
  321. // * nextDown(+Normal) -> +Normal.
  322. // * nextUp(-Normal) -> -Normal.
  323. // * nextDown(-Normal) -> -Normal.
  324. // nextUp(+Denormal) -> +Denormal.
  325. test = APFloat(APFloat::IEEEquad,
  326. "0x0.ffffffffffffffffffffffff000cp-16382");
  327. expected = APFloat(APFloat::IEEEquad,
  328. "0x0.ffffffffffffffffffffffff000dp-16382");
  329. EXPECT_EQ(test.next(false), APFloat::opOK);
  330. EXPECT_TRUE(test.isDenormal());
  331. EXPECT_TRUE(!test.isNegative());
  332. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  333. // nextDown(+Denormal) -> +Denormal.
  334. test = APFloat(APFloat::IEEEquad,
  335. "0x0.ffffffffffffffffffffffff000cp-16382");
  336. expected = APFloat(APFloat::IEEEquad,
  337. "0x0.ffffffffffffffffffffffff000bp-16382");
  338. EXPECT_EQ(test.next(true), APFloat::opOK);
  339. EXPECT_TRUE(test.isDenormal());
  340. EXPECT_TRUE(!test.isNegative());
  341. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  342. // nextUp(-Denormal) -> -Denormal.
  343. test = APFloat(APFloat::IEEEquad,
  344. "-0x0.ffffffffffffffffffffffff000cp-16382");
  345. expected = APFloat(APFloat::IEEEquad,
  346. "-0x0.ffffffffffffffffffffffff000bp-16382");
  347. EXPECT_EQ(test.next(false), APFloat::opOK);
  348. EXPECT_TRUE(test.isDenormal());
  349. EXPECT_TRUE(test.isNegative());
  350. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  351. // nextDown(-Denormal) -> -Denormal
  352. test = APFloat(APFloat::IEEEquad,
  353. "-0x0.ffffffffffffffffffffffff000cp-16382");
  354. expected = APFloat(APFloat::IEEEquad,
  355. "-0x0.ffffffffffffffffffffffff000dp-16382");
  356. EXPECT_EQ(test.next(true), APFloat::opOK);
  357. EXPECT_TRUE(test.isDenormal());
  358. EXPECT_TRUE(test.isNegative());
  359. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  360. // nextUp(+Normal) -> +Normal.
  361. test = APFloat(APFloat::IEEEquad,
  362. "0x1.ffffffffffffffffffffffff000cp-16000");
  363. expected = APFloat(APFloat::IEEEquad,
  364. "0x1.ffffffffffffffffffffffff000dp-16000");
  365. EXPECT_EQ(test.next(false), APFloat::opOK);
  366. EXPECT_TRUE(!test.isDenormal());
  367. EXPECT_TRUE(!test.isNegative());
  368. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  369. // nextDown(+Normal) -> +Normal.
  370. test = APFloat(APFloat::IEEEquad,
  371. "0x1.ffffffffffffffffffffffff000cp-16000");
  372. expected = APFloat(APFloat::IEEEquad,
  373. "0x1.ffffffffffffffffffffffff000bp-16000");
  374. EXPECT_EQ(test.next(true), APFloat::opOK);
  375. EXPECT_TRUE(!test.isDenormal());
  376. EXPECT_TRUE(!test.isNegative());
  377. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  378. // nextUp(-Normal) -> -Normal.
  379. test = APFloat(APFloat::IEEEquad,
  380. "-0x1.ffffffffffffffffffffffff000cp-16000");
  381. expected = APFloat(APFloat::IEEEquad,
  382. "-0x1.ffffffffffffffffffffffff000bp-16000");
  383. EXPECT_EQ(test.next(false), APFloat::opOK);
  384. EXPECT_TRUE(!test.isDenormal());
  385. EXPECT_TRUE(test.isNegative());
  386. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  387. // nextDown(-Normal) -> -Normal.
  388. test = APFloat(APFloat::IEEEquad,
  389. "-0x1.ffffffffffffffffffffffff000cp-16000");
  390. expected = APFloat(APFloat::IEEEquad,
  391. "-0x1.ffffffffffffffffffffffff000dp-16000");
  392. EXPECT_EQ(test.next(true), APFloat::opOK);
  393. EXPECT_TRUE(!test.isDenormal());
  394. EXPECT_TRUE(test.isNegative());
  395. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  396. }
  397. TEST(APFloatTest, FMA) {
  398. APFloat::roundingMode rdmd = APFloat::rmNearestTiesToEven;
  399. {
  400. APFloat f1(14.5f);
  401. APFloat f2(-14.5f);
  402. APFloat f3(225.0f);
  403. f1.fusedMultiplyAdd(f2, f3, APFloat::rmNearestTiesToEven);
  404. EXPECT_EQ(14.75f, f1.convertToFloat());
  405. }
  406. {
  407. APFloat Val2(2.0f);
  408. APFloat f1((float)1.17549435e-38F);
  409. APFloat f2((float)1.17549435e-38F);
  410. f1.divide(Val2, rdmd);
  411. f2.divide(Val2, rdmd);
  412. APFloat f3(12.0f);
  413. f1.fusedMultiplyAdd(f2, f3, APFloat::rmNearestTiesToEven);
  414. EXPECT_EQ(12.0f, f1.convertToFloat());
  415. }
  416. // Test for correct zero sign when answer is exactly zero.
  417. // fma(1.0, -1.0, 1.0) -> +ve 0.
  418. {
  419. APFloat f1(1.0);
  420. APFloat f2(-1.0);
  421. APFloat f3(1.0);
  422. f1.fusedMultiplyAdd(f2, f3, APFloat::rmNearestTiesToEven);
  423. EXPECT_TRUE(!f1.isNegative() && f1.isZero());
  424. }
  425. // Test for correct zero sign when answer is exactly zero and rounding towards
  426. // negative.
  427. // fma(1.0, -1.0, 1.0) -> +ve 0.
  428. {
  429. APFloat f1(1.0);
  430. APFloat f2(-1.0);
  431. APFloat f3(1.0);
  432. f1.fusedMultiplyAdd(f2, f3, APFloat::rmTowardNegative);
  433. EXPECT_TRUE(f1.isNegative() && f1.isZero());
  434. }
  435. // Test for correct (in this case -ve) sign when adding like signed zeros.
  436. // Test fma(0.0, -0.0, -0.0) -> -ve 0.
  437. {
  438. APFloat f1(0.0);
  439. APFloat f2(-0.0);
  440. APFloat f3(-0.0);
  441. f1.fusedMultiplyAdd(f2, f3, APFloat::rmNearestTiesToEven);
  442. EXPECT_TRUE(f1.isNegative() && f1.isZero());
  443. }
  444. // Test -ve sign preservation when small negative results underflow.
  445. {
  446. APFloat f1(APFloat::IEEEdouble, "-0x1p-1074");
  447. APFloat f2(APFloat::IEEEdouble, "+0x1p-1074");
  448. APFloat f3(0.0);
  449. f1.fusedMultiplyAdd(f2, f3, APFloat::rmNearestTiesToEven);
  450. EXPECT_TRUE(f1.isNegative() && f1.isZero());
  451. }
  452. // Test x87 extended precision case from http://llvm.org/PR20728.
  453. {
  454. APFloat M1(APFloat::x87DoubleExtended, 1.0);
  455. APFloat M2(APFloat::x87DoubleExtended, 1.0);
  456. APFloat A(APFloat::x87DoubleExtended, 3.0);
  457. bool losesInfo = false;
  458. M1.fusedMultiplyAdd(M1, A, APFloat::rmNearestTiesToEven);
  459. M1.convert(APFloat::IEEEsingle, APFloat::rmNearestTiesToEven, &losesInfo);
  460. EXPECT_FALSE(losesInfo);
  461. EXPECT_EQ(4.0f, M1.convertToFloat());
  462. }
  463. }
  464. TEST(APFloatTest, MinNum) {
  465. APFloat f1(1.0);
  466. APFloat f2(2.0);
  467. APFloat nan = APFloat::getNaN(APFloat::IEEEdouble);
  468. EXPECT_EQ(1.0, minnum(f1, f2).convertToDouble());
  469. EXPECT_EQ(1.0, minnum(f2, f1).convertToDouble());
  470. EXPECT_EQ(1.0, minnum(f1, nan).convertToDouble());
  471. EXPECT_EQ(1.0, minnum(nan, f1).convertToDouble());
  472. }
  473. TEST(APFloatTest, MaxNum) {
  474. APFloat f1(1.0);
  475. APFloat f2(2.0);
  476. APFloat nan = APFloat::getNaN(APFloat::IEEEdouble);
  477. EXPECT_EQ(2.0, maxnum(f1, f2).convertToDouble());
  478. EXPECT_EQ(2.0, maxnum(f2, f1).convertToDouble());
  479. EXPECT_EQ(1.0, maxnum(f1, nan).convertToDouble());
  480. EXPECT_EQ(1.0, minnum(nan, f1).convertToDouble());
  481. }
  482. TEST(APFloatTest, Denormal) {
  483. APFloat::roundingMode rdmd = APFloat::rmNearestTiesToEven;
  484. // Test single precision
  485. {
  486. const char *MinNormalStr = "1.17549435082228750797e-38";
  487. EXPECT_FALSE(APFloat(APFloat::IEEEsingle, MinNormalStr).isDenormal());
  488. EXPECT_FALSE(APFloat(APFloat::IEEEsingle, 0.0).isDenormal());
  489. APFloat Val2(APFloat::IEEEsingle, 2.0e0);
  490. APFloat T(APFloat::IEEEsingle, MinNormalStr);
  491. T.divide(Val2, rdmd);
  492. EXPECT_TRUE(T.isDenormal());
  493. }
  494. // Test double precision
  495. {
  496. const char *MinNormalStr = "2.22507385850720138309e-308";
  497. EXPECT_FALSE(APFloat(APFloat::IEEEdouble, MinNormalStr).isDenormal());
  498. EXPECT_FALSE(APFloat(APFloat::IEEEdouble, 0.0).isDenormal());
  499. APFloat Val2(APFloat::IEEEdouble, 2.0e0);
  500. APFloat T(APFloat::IEEEdouble, MinNormalStr);
  501. T.divide(Val2, rdmd);
  502. EXPECT_TRUE(T.isDenormal());
  503. }
  504. // Test Intel double-ext
  505. {
  506. const char *MinNormalStr = "3.36210314311209350626e-4932";
  507. EXPECT_FALSE(APFloat(APFloat::x87DoubleExtended, MinNormalStr).isDenormal());
  508. EXPECT_FALSE(APFloat(APFloat::x87DoubleExtended, 0.0).isDenormal());
  509. APFloat Val2(APFloat::x87DoubleExtended, 2.0e0);
  510. APFloat T(APFloat::x87DoubleExtended, MinNormalStr);
  511. T.divide(Val2, rdmd);
  512. EXPECT_TRUE(T.isDenormal());
  513. }
  514. // Test quadruple precision
  515. {
  516. const char *MinNormalStr = "3.36210314311209350626267781732175260e-4932";
  517. EXPECT_FALSE(APFloat(APFloat::IEEEquad, MinNormalStr).isDenormal());
  518. EXPECT_FALSE(APFloat(APFloat::IEEEquad, 0.0).isDenormal());
  519. APFloat Val2(APFloat::IEEEquad, 2.0e0);
  520. APFloat T(APFloat::IEEEquad, MinNormalStr);
  521. T.divide(Val2, rdmd);
  522. EXPECT_TRUE(T.isDenormal());
  523. }
  524. }
  525. TEST(APFloatTest, Zero) {
  526. EXPECT_EQ(0.0f, APFloat(0.0f).convertToFloat());
  527. EXPECT_EQ(-0.0f, APFloat(-0.0f).convertToFloat());
  528. EXPECT_TRUE(APFloat(-0.0f).isNegative());
  529. EXPECT_EQ(0.0, APFloat(0.0).convertToDouble());
  530. EXPECT_EQ(-0.0, APFloat(-0.0).convertToDouble());
  531. EXPECT_TRUE(APFloat(-0.0).isNegative());
  532. }
  533. TEST(APFloatTest, DecimalStringsWithoutNullTerminators) {
  534. // Make sure that we can parse strings without null terminators.
  535. // rdar://14323230.
  536. APFloat Val(APFloat::IEEEdouble);
  537. Val.convertFromString(StringRef("0.00", 3),
  538. llvm::APFloat::rmNearestTiesToEven);
  539. EXPECT_EQ(Val.convertToDouble(), 0.0);
  540. Val.convertFromString(StringRef("0.01", 3),
  541. llvm::APFloat::rmNearestTiesToEven);
  542. EXPECT_EQ(Val.convertToDouble(), 0.0);
  543. Val.convertFromString(StringRef("0.09", 3),
  544. llvm::APFloat::rmNearestTiesToEven);
  545. EXPECT_EQ(Val.convertToDouble(), 0.0);
  546. Val.convertFromString(StringRef("0.095", 4),
  547. llvm::APFloat::rmNearestTiesToEven);
  548. EXPECT_EQ(Val.convertToDouble(), 0.09);
  549. Val.convertFromString(StringRef("0.00e+3", 7),
  550. llvm::APFloat::rmNearestTiesToEven);
  551. EXPECT_EQ(Val.convertToDouble(), 0.00);
  552. Val.convertFromString(StringRef("0e+3", 4),
  553. llvm::APFloat::rmNearestTiesToEven);
  554. EXPECT_EQ(Val.convertToDouble(), 0.00);
  555. }
  556. TEST(APFloatTest, fromZeroDecimalString) {
  557. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0").convertToDouble());
  558. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0").convertToDouble());
  559. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0").convertToDouble());
  560. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.").convertToDouble());
  561. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.").convertToDouble());
  562. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.").convertToDouble());
  563. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, ".0").convertToDouble());
  564. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+.0").convertToDouble());
  565. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-.0").convertToDouble());
  566. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.0").convertToDouble());
  567. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.0").convertToDouble());
  568. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.0").convertToDouble());
  569. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "00000.").convertToDouble());
  570. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+00000.").convertToDouble());
  571. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-00000.").convertToDouble());
  572. EXPECT_EQ(0.0, APFloat(APFloat::IEEEdouble, ".00000").convertToDouble());
  573. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+.00000").convertToDouble());
  574. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-.00000").convertToDouble());
  575. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0000.00000").convertToDouble());
  576. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0000.00000").convertToDouble());
  577. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0000.00000").convertToDouble());
  578. }
  579. TEST(APFloatTest, fromZeroDecimalSingleExponentString) {
  580. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0e1").convertToDouble());
  581. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e1").convertToDouble());
  582. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e1").convertToDouble());
  583. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0e+1").convertToDouble());
  584. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e+1").convertToDouble());
  585. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e+1").convertToDouble());
  586. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0e-1").convertToDouble());
  587. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e-1").convertToDouble());
  588. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e-1").convertToDouble());
  589. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.e1").convertToDouble());
  590. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.e1").convertToDouble());
  591. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.e1").convertToDouble());
  592. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.e+1").convertToDouble());
  593. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.e+1").convertToDouble());
  594. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.e+1").convertToDouble());
  595. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.e-1").convertToDouble());
  596. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.e-1").convertToDouble());
  597. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.e-1").convertToDouble());
  598. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, ".0e1").convertToDouble());
  599. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+.0e1").convertToDouble());
  600. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-.0e1").convertToDouble());
  601. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, ".0e+1").convertToDouble());
  602. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+.0e+1").convertToDouble());
  603. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-.0e+1").convertToDouble());
  604. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, ".0e-1").convertToDouble());
  605. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+.0e-1").convertToDouble());
  606. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-.0e-1").convertToDouble());
  607. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.0e1").convertToDouble());
  608. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.0e1").convertToDouble());
  609. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.0e1").convertToDouble());
  610. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.0e+1").convertToDouble());
  611. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.0e+1").convertToDouble());
  612. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.0e+1").convertToDouble());
  613. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.0e-1").convertToDouble());
  614. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.0e-1").convertToDouble());
  615. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.0e-1").convertToDouble());
  616. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "000.0000e1").convertToDouble());
  617. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+000.0000e+1").convertToDouble());
  618. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-000.0000e+1").convertToDouble());
  619. }
  620. TEST(APFloatTest, fromZeroDecimalLargeExponentString) {
  621. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0e1234").convertToDouble());
  622. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e1234").convertToDouble());
  623. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e1234").convertToDouble());
  624. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0e+1234").convertToDouble());
  625. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e+1234").convertToDouble());
  626. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e+1234").convertToDouble());
  627. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0e-1234").convertToDouble());
  628. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e-1234").convertToDouble());
  629. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e-1234").convertToDouble());
  630. EXPECT_EQ(0.0, APFloat(APFloat::IEEEdouble, "000.0000e1234").convertToDouble());
  631. EXPECT_EQ(0.0, APFloat(APFloat::IEEEdouble, "000.0000e-1234").convertToDouble());
  632. EXPECT_EQ(0.0, APFloat(APFloat::IEEEdouble, StringRef("0e1234\02", 6)).convertToDouble());
  633. }
  634. TEST(APFloatTest, fromZeroHexadecimalString) {
  635. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0p1").convertToDouble());
  636. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0p1").convertToDouble());
  637. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0p1").convertToDouble());
  638. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0p+1").convertToDouble());
  639. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0p+1").convertToDouble());
  640. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0p+1").convertToDouble());
  641. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0p-1").convertToDouble());
  642. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0p-1").convertToDouble());
  643. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0p-1").convertToDouble());
  644. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.p1").convertToDouble());
  645. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.p1").convertToDouble());
  646. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.p1").convertToDouble());
  647. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.p+1").convertToDouble());
  648. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.p+1").convertToDouble());
  649. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.p+1").convertToDouble());
  650. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.p-1").convertToDouble());
  651. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.p-1").convertToDouble());
  652. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.p-1").convertToDouble());
  653. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x.0p1").convertToDouble());
  654. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x.0p1").convertToDouble());
  655. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x.0p1").convertToDouble());
  656. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x.0p+1").convertToDouble());
  657. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x.0p+1").convertToDouble());
  658. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x.0p+1").convertToDouble());
  659. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x.0p-1").convertToDouble());
  660. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x.0p-1").convertToDouble());
  661. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x.0p-1").convertToDouble());
  662. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.0p1").convertToDouble());
  663. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.0p1").convertToDouble());
  664. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.0p1").convertToDouble());
  665. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.0p+1").convertToDouble());
  666. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.0p+1").convertToDouble());
  667. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.0p+1").convertToDouble());
  668. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.0p-1").convertToDouble());
  669. EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.0p-1").convertToDouble());
  670. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.0p-1").convertToDouble());
  671. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x00000.p1").convertToDouble());
  672. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0000.00000p1").convertToDouble());
  673. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x.00000p1").convertToDouble());
  674. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.p1").convertToDouble());
  675. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0p1234").convertToDouble());
  676. EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0p1234").convertToDouble());
  677. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x00000.p1234").convertToDouble());
  678. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0000.00000p1234").convertToDouble());
  679. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x.00000p1234").convertToDouble());
  680. EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.p1234").convertToDouble());
  681. }
  682. TEST(APFloatTest, fromDecimalString) {
  683. EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble, "1").convertToDouble());
  684. EXPECT_EQ(2.0, APFloat(APFloat::IEEEdouble, "2.").convertToDouble());
  685. EXPECT_EQ(0.5, APFloat(APFloat::IEEEdouble, ".5").convertToDouble());
  686. EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble, "1.0").convertToDouble());
  687. EXPECT_EQ(-2.0, APFloat(APFloat::IEEEdouble, "-2").convertToDouble());
  688. EXPECT_EQ(-4.0, APFloat(APFloat::IEEEdouble, "-4.").convertToDouble());
  689. EXPECT_EQ(-0.5, APFloat(APFloat::IEEEdouble, "-.5").convertToDouble());
  690. EXPECT_EQ(-1.5, APFloat(APFloat::IEEEdouble, "-1.5").convertToDouble());
  691. EXPECT_EQ(1.25e12, APFloat(APFloat::IEEEdouble, "1.25e12").convertToDouble());
  692. EXPECT_EQ(1.25e+12, APFloat(APFloat::IEEEdouble, "1.25e+12").convertToDouble());
  693. EXPECT_EQ(1.25e-12, APFloat(APFloat::IEEEdouble, "1.25e-12").convertToDouble());
  694. EXPECT_EQ(1024.0, APFloat(APFloat::IEEEdouble, "1024.").convertToDouble());
  695. EXPECT_EQ(1024.05, APFloat(APFloat::IEEEdouble, "1024.05000").convertToDouble());
  696. EXPECT_EQ(0.05, APFloat(APFloat::IEEEdouble, ".05000").convertToDouble());
  697. EXPECT_EQ(2.0, APFloat(APFloat::IEEEdouble, "2.").convertToDouble());
  698. EXPECT_EQ(2.0e2, APFloat(APFloat::IEEEdouble, "2.e2").convertToDouble());
  699. EXPECT_EQ(2.0e+2, APFloat(APFloat::IEEEdouble, "2.e+2").convertToDouble());
  700. EXPECT_EQ(2.0e-2, APFloat(APFloat::IEEEdouble, "2.e-2").convertToDouble());
  701. EXPECT_EQ(2.05e2, APFloat(APFloat::IEEEdouble, "002.05000e2").convertToDouble());
  702. EXPECT_EQ(2.05e+2, APFloat(APFloat::IEEEdouble, "002.05000e+2").convertToDouble());
  703. EXPECT_EQ(2.05e-2, APFloat(APFloat::IEEEdouble, "002.05000e-2").convertToDouble());
  704. EXPECT_EQ(2.05e12, APFloat(APFloat::IEEEdouble, "002.05000e12").convertToDouble());
  705. EXPECT_EQ(2.05e+12, APFloat(APFloat::IEEEdouble, "002.05000e+12").convertToDouble());
  706. EXPECT_EQ(2.05e-12, APFloat(APFloat::IEEEdouble, "002.05000e-12").convertToDouble());
  707. // These are "carefully selected" to overflow the fast log-base
  708. // calculations in APFloat.cpp
  709. EXPECT_TRUE(APFloat(APFloat::IEEEdouble, "99e99999").isInfinity());
  710. EXPECT_TRUE(APFloat(APFloat::IEEEdouble, "-99e99999").isInfinity());
  711. EXPECT_TRUE(APFloat(APFloat::IEEEdouble, "1e-99999").isPosZero());
  712. EXPECT_TRUE(APFloat(APFloat::IEEEdouble, "-1e-99999").isNegZero());
  713. EXPECT_EQ(2.71828, convertToDoubleFromString("2.71828"));
  714. }
  715. TEST(APFloatTest, fromHexadecimalString) {
  716. EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble, "0x1p0").convertToDouble());
  717. EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble, "+0x1p0").convertToDouble());
  718. EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble, "-0x1p0").convertToDouble());
  719. EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble, "0x1p+0").convertToDouble());
  720. EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble, "+0x1p+0").convertToDouble());
  721. EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble, "-0x1p+0").convertToDouble());
  722. EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble, "0x1p-0").convertToDouble());
  723. EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble, "+0x1p-0").convertToDouble());
  724. EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble, "-0x1p-0").convertToDouble());
  725. EXPECT_EQ( 2.0, APFloat(APFloat::IEEEdouble, "0x1p1").convertToDouble());
  726. EXPECT_EQ(+2.0, APFloat(APFloat::IEEEdouble, "+0x1p1").convertToDouble());
  727. EXPECT_EQ(-2.0, APFloat(APFloat::IEEEdouble, "-0x1p1").convertToDouble());
  728. EXPECT_EQ( 2.0, APFloat(APFloat::IEEEdouble, "0x1p+1").convertToDouble());
  729. EXPECT_EQ(+2.0, APFloat(APFloat::IEEEdouble, "+0x1p+1").convertToDouble());
  730. EXPECT_EQ(-2.0, APFloat(APFloat::IEEEdouble, "-0x1p+1").convertToDouble());
  731. EXPECT_EQ( 0.5, APFloat(APFloat::IEEEdouble, "0x1p-1").convertToDouble());
  732. EXPECT_EQ(+0.5, APFloat(APFloat::IEEEdouble, "+0x1p-1").convertToDouble());
  733. EXPECT_EQ(-0.5, APFloat(APFloat::IEEEdouble, "-0x1p-1").convertToDouble());
  734. EXPECT_EQ( 3.0, APFloat(APFloat::IEEEdouble, "0x1.8p1").convertToDouble());
  735. EXPECT_EQ(+3.0, APFloat(APFloat::IEEEdouble, "+0x1.8p1").convertToDouble());
  736. EXPECT_EQ(-3.0, APFloat(APFloat::IEEEdouble, "-0x1.8p1").convertToDouble());
  737. EXPECT_EQ( 3.0, APFloat(APFloat::IEEEdouble, "0x1.8p+1").convertToDouble());
  738. EXPECT_EQ(+3.0, APFloat(APFloat::IEEEdouble, "+0x1.8p+1").convertToDouble());
  739. EXPECT_EQ(-3.0, APFloat(APFloat::IEEEdouble, "-0x1.8p+1").convertToDouble());
  740. EXPECT_EQ( 0.75, APFloat(APFloat::IEEEdouble, "0x1.8p-1").convertToDouble());
  741. EXPECT_EQ(+0.75, APFloat(APFloat::IEEEdouble, "+0x1.8p-1").convertToDouble());
  742. EXPECT_EQ(-0.75, APFloat(APFloat::IEEEdouble, "-0x1.8p-1").convertToDouble());
  743. EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble, "0x1000.000p1").convertToDouble());
  744. EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble, "+0x1000.000p1").convertToDouble());
  745. EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble, "-0x1000.000p1").convertToDouble());
  746. EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble, "0x1000.000p+1").convertToDouble());
  747. EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble, "+0x1000.000p+1").convertToDouble());
  748. EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble, "-0x1000.000p+1").convertToDouble());
  749. EXPECT_EQ( 2048.0, APFloat(APFloat::IEEEdouble, "0x1000.000p-1").convertToDouble());
  750. EXPECT_EQ(+2048.0, APFloat(APFloat::IEEEdouble, "+0x1000.000p-1").convertToDouble());
  751. EXPECT_EQ(-2048.0, APFloat(APFloat::IEEEdouble, "-0x1000.000p-1").convertToDouble());
  752. EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble, "0x1000p1").convertToDouble());
  753. EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble, "+0x1000p1").convertToDouble());
  754. EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble, "-0x1000p1").convertToDouble());
  755. EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble, "0x1000p+1").convertToDouble());
  756. EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble, "+0x1000p+1").convertToDouble());
  757. EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble, "-0x1000p+1").convertToDouble());
  758. EXPECT_EQ( 2048.0, APFloat(APFloat::IEEEdouble, "0x1000p-1").convertToDouble());
  759. EXPECT_EQ(+2048.0, APFloat(APFloat::IEEEdouble, "+0x1000p-1").convertToDouble());
  760. EXPECT_EQ(-2048.0, APFloat(APFloat::IEEEdouble, "-0x1000p-1").convertToDouble());
  761. EXPECT_EQ( 16384.0, APFloat(APFloat::IEEEdouble, "0x10p10").convertToDouble());
  762. EXPECT_EQ(+16384.0, APFloat(APFloat::IEEEdouble, "+0x10p10").convertToDouble());
  763. EXPECT_EQ(-16384.0, APFloat(APFloat::IEEEdouble, "-0x10p10").convertToDouble());
  764. EXPECT_EQ( 16384.0, APFloat(APFloat::IEEEdouble, "0x10p+10").convertToDouble());
  765. EXPECT_EQ(+16384.0, APFloat(APFloat::IEEEdouble, "+0x10p+10").convertToDouble());
  766. EXPECT_EQ(-16384.0, APFloat(APFloat::IEEEdouble, "-0x10p+10").convertToDouble());
  767. EXPECT_EQ( 0.015625, APFloat(APFloat::IEEEdouble, "0x10p-10").convertToDouble());
  768. EXPECT_EQ(+0.015625, APFloat(APFloat::IEEEdouble, "+0x10p-10").convertToDouble());
  769. EXPECT_EQ(-0.015625, APFloat(APFloat::IEEEdouble, "-0x10p-10").convertToDouble());
  770. EXPECT_EQ(1.0625, APFloat(APFloat::IEEEdouble, "0x1.1p0").convertToDouble());
  771. EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble, "0x1p0").convertToDouble());
  772. EXPECT_EQ(convertToDoubleFromString("0x1p-150"),
  773. convertToDoubleFromString("+0x800000000000000001.p-221"));
  774. EXPECT_EQ(2251799813685248.5,
  775. convertToDoubleFromString("0x80000000000004000000.010p-28"));
  776. }
  777. TEST(APFloatTest, toString) {
  778. ASSERT_EQ("10", convertToString(10.0, 6, 3));
  779. ASSERT_EQ("1.0E+1", convertToString(10.0, 6, 0));
  780. ASSERT_EQ("10100", convertToString(1.01E+4, 5, 2));
  781. ASSERT_EQ("1.01E+4", convertToString(1.01E+4, 4, 2));
  782. ASSERT_EQ("1.01E+4", convertToString(1.01E+4, 5, 1));
  783. ASSERT_EQ("0.0101", convertToString(1.01E-2, 5, 2));
  784. ASSERT_EQ("0.0101", convertToString(1.01E-2, 4, 2));
  785. ASSERT_EQ("1.01E-2", convertToString(1.01E-2, 5, 1));
  786. ASSERT_EQ("0.78539816339744828", convertToString(0.78539816339744830961, 0, 3));
  787. ASSERT_EQ("4.9406564584124654E-324", convertToString(4.9406564584124654e-324, 0, 3));
  788. ASSERT_EQ("873.18340000000001", convertToString(873.1834, 0, 1));
  789. ASSERT_EQ("8.7318340000000001E+2", convertToString(873.1834, 0, 0));
  790. ASSERT_EQ("1.7976931348623157E+308", convertToString(1.7976931348623157E+308, 0, 0));
  791. }
  792. TEST(APFloatTest, toInteger) {
  793. bool isExact = false;
  794. APSInt result(5, /*isUnsigned=*/true);
  795. EXPECT_EQ(APFloat::opOK,
  796. APFloat(APFloat::IEEEdouble, "10")
  797. .convertToInteger(result, APFloat::rmTowardZero, &isExact));
  798. EXPECT_TRUE(isExact);
  799. EXPECT_EQ(APSInt(APInt(5, 10), true), result);
  800. EXPECT_EQ(APFloat::opInvalidOp,
  801. APFloat(APFloat::IEEEdouble, "-10")
  802. .convertToInteger(result, APFloat::rmTowardZero, &isExact));
  803. EXPECT_FALSE(isExact);
  804. EXPECT_EQ(APSInt::getMinValue(5, true), result);
  805. EXPECT_EQ(APFloat::opInvalidOp,
  806. APFloat(APFloat::IEEEdouble, "32")
  807. .convertToInteger(result, APFloat::rmTowardZero, &isExact));
  808. EXPECT_FALSE(isExact);
  809. EXPECT_EQ(APSInt::getMaxValue(5, true), result);
  810. EXPECT_EQ(APFloat::opInexact,
  811. APFloat(APFloat::IEEEdouble, "7.9")
  812. .convertToInteger(result, APFloat::rmTowardZero, &isExact));
  813. EXPECT_FALSE(isExact);
  814. EXPECT_EQ(APSInt(APInt(5, 7), true), result);
  815. result.setIsUnsigned(false);
  816. EXPECT_EQ(APFloat::opOK,
  817. APFloat(APFloat::IEEEdouble, "-10")
  818. .convertToInteger(result, APFloat::rmTowardZero, &isExact));
  819. EXPECT_TRUE(isExact);
  820. EXPECT_EQ(APSInt(APInt(5, -10, true), false), result);
  821. EXPECT_EQ(APFloat::opInvalidOp,
  822. APFloat(APFloat::IEEEdouble, "-17")
  823. .convertToInteger(result, APFloat::rmTowardZero, &isExact));
  824. EXPECT_FALSE(isExact);
  825. EXPECT_EQ(APSInt::getMinValue(5, false), result);
  826. EXPECT_EQ(APFloat::opInvalidOp,
  827. APFloat(APFloat::IEEEdouble, "16")
  828. .convertToInteger(result, APFloat::rmTowardZero, &isExact));
  829. EXPECT_FALSE(isExact);
  830. EXPECT_EQ(APSInt::getMaxValue(5, false), result);
  831. }
  832. static APInt nanbits(const fltSemantics &Sem,
  833. bool SNaN, bool Negative, uint64_t fill) {
  834. APInt apfill(64, fill);
  835. if (SNaN)
  836. return APFloat::getSNaN(Sem, Negative, &apfill).bitcastToAPInt();
  837. else
  838. return APFloat::getQNaN(Sem, Negative, &apfill).bitcastToAPInt();
  839. }
  840. TEST(APFloatTest, makeNaN) {
  841. ASSERT_EQ(0x7fc00000, nanbits(APFloat::IEEEsingle, false, false, 0));
  842. ASSERT_EQ(0xffc00000, nanbits(APFloat::IEEEsingle, false, true, 0));
  843. ASSERT_EQ(0x7fc0ae72, nanbits(APFloat::IEEEsingle, false, false, 0xae72));
  844. ASSERT_EQ(0x7fffae72, nanbits(APFloat::IEEEsingle, false, false, 0xffffae72));
  845. ASSERT_EQ(0x7fa00000, nanbits(APFloat::IEEEsingle, true, false, 0));
  846. ASSERT_EQ(0xffa00000, nanbits(APFloat::IEEEsingle, true, true, 0));
  847. ASSERT_EQ(0x7f80ae72, nanbits(APFloat::IEEEsingle, true, false, 0xae72));
  848. ASSERT_EQ(0x7fbfae72, nanbits(APFloat::IEEEsingle, true, false, 0xffffae72));
  849. ASSERT_EQ(0x7ff8000000000000ULL, nanbits(APFloat::IEEEdouble, false, false, 0));
  850. ASSERT_EQ(0xfff8000000000000ULL, nanbits(APFloat::IEEEdouble, false, true, 0));
  851. ASSERT_EQ(0x7ff800000000ae72ULL, nanbits(APFloat::IEEEdouble, false, false, 0xae72));
  852. ASSERT_EQ(0x7fffffffffffae72ULL, nanbits(APFloat::IEEEdouble, false, false, 0xffffffffffffae72ULL));
  853. ASSERT_EQ(0x7ff4000000000000ULL, nanbits(APFloat::IEEEdouble, true, false, 0));
  854. ASSERT_EQ(0xfff4000000000000ULL, nanbits(APFloat::IEEEdouble, true, true, 0));
  855. ASSERT_EQ(0x7ff000000000ae72ULL, nanbits(APFloat::IEEEdouble, true, false, 0xae72));
  856. ASSERT_EQ(0x7ff7ffffffffae72ULL, nanbits(APFloat::IEEEdouble, true, false, 0xffffffffffffae72ULL));
  857. }
  858. #ifdef GTEST_HAS_DEATH_TEST
  859. #ifndef NDEBUG
  860. TEST(APFloatTest, SemanticsDeath) {
  861. EXPECT_DEATH(APFloat(APFloat::IEEEsingle, 0.0f).convertToDouble(), "Float semantics are not IEEEdouble");
  862. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, 0.0 ).convertToFloat(), "Float semantics are not IEEEsingle");
  863. }
  864. TEST(APFloatTest, StringDecimalDeath) {
  865. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ""), "Invalid string length");
  866. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+"), "String has no digits");
  867. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-"), "String has no digits");
  868. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("\0", 1)), "Invalid character in significand");
  869. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1\0", 2)), "Invalid character in significand");
  870. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1\02", 3)), "Invalid character in significand");
  871. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1\02e1", 5)), "Invalid character in significand");
  872. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1e\0", 3)), "Invalid character in exponent");
  873. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1e1\0", 4)), "Invalid character in exponent");
  874. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1e1\02", 5)), "Invalid character in exponent");
  875. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.0f"), "Invalid character in significand");
  876. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".."), "String contains multiple dots");
  877. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "..0"), "String contains multiple dots");
  878. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.0.0"), "String contains multiple dots");
  879. }
  880. TEST(APFloatTest, StringDecimalSignificandDeath) {
  881. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "."), "Significand has no digits");
  882. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+."), "Significand has no digits");
  883. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-."), "Significand has no digits");
  884. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "e"), "Significand has no digits");
  885. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+e"), "Significand has no digits");
  886. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-e"), "Significand has no digits");
  887. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "e1"), "Significand has no digits");
  888. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+e1"), "Significand has no digits");
  889. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-e1"), "Significand has no digits");
  890. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".e1"), "Significand has no digits");
  891. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+.e1"), "Significand has no digits");
  892. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-.e1"), "Significand has no digits");
  893. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".e"), "Significand has no digits");
  894. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+.e"), "Significand has no digits");
  895. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-.e"), "Significand has no digits");
  896. }
  897. TEST(APFloatTest, StringDecimalExponentDeath) {
  898. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1e"), "Exponent has no digits");
  899. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+1e"), "Exponent has no digits");
  900. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-1e"), "Exponent has no digits");
  901. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.e"), "Exponent has no digits");
  902. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+1.e"), "Exponent has no digits");
  903. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-1.e"), "Exponent has no digits");
  904. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".1e"), "Exponent has no digits");
  905. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+.1e"), "Exponent has no digits");
  906. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-.1e"), "Exponent has no digits");
  907. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.1e"), "Exponent has no digits");
  908. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+1.1e"), "Exponent has no digits");
  909. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-1.1e"), "Exponent has no digits");
  910. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1e+"), "Exponent has no digits");
  911. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1e-"), "Exponent has no digits");
  912. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".1e"), "Exponent has no digits");
  913. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".1e+"), "Exponent has no digits");
  914. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".1e-"), "Exponent has no digits");
  915. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.0e"), "Exponent has no digits");
  916. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.0e+"), "Exponent has no digits");
  917. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.0e-"), "Exponent has no digits");
  918. }
  919. TEST(APFloatTest, StringHexadecimalDeath) {
  920. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x"), "Invalid string");
  921. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x"), "Invalid string");
  922. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x"), "Invalid string");
  923. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x0"), "Hex strings require an exponent");
  924. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x0"), "Hex strings require an exponent");
  925. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x0"), "Hex strings require an exponent");
  926. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x0."), "Hex strings require an exponent");
  927. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x0."), "Hex strings require an exponent");
  928. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x0."), "Hex strings require an exponent");
  929. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x.0"), "Hex strings require an exponent");
  930. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.0"), "Hex strings require an exponent");
  931. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.0"), "Hex strings require an exponent");
  932. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x0.0"), "Hex strings require an exponent");
  933. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x0.0"), "Hex strings require an exponent");
  934. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x0.0"), "Hex strings require an exponent");
  935. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x\0", 3)), "Invalid character in significand");
  936. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1\0", 4)), "Invalid character in significand");
  937. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1\02", 5)), "Invalid character in significand");
  938. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1\02p1", 7)), "Invalid character in significand");
  939. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1p\0", 5)), "Invalid character in exponent");
  940. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1p1\0", 6)), "Invalid character in exponent");
  941. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1p1\02", 7)), "Invalid character in exponent");
  942. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1p0f"), "Invalid character in exponent");
  943. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x..p1"), "String contains multiple dots");
  944. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x..0p1"), "String contains multiple dots");
  945. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.0.0p1"), "String contains multiple dots");
  946. }
  947. TEST(APFloatTest, StringHexadecimalSignificandDeath) {
  948. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x."), "Significand has no digits");
  949. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x."), "Significand has no digits");
  950. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x."), "Significand has no digits");
  951. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0xp"), "Significand has no digits");
  952. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0xp"), "Significand has no digits");
  953. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0xp"), "Significand has no digits");
  954. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0xp+"), "Significand has no digits");
  955. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0xp+"), "Significand has no digits");
  956. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0xp+"), "Significand has no digits");
  957. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0xp-"), "Significand has no digits");
  958. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0xp-"), "Significand has no digits");
  959. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0xp-"), "Significand has no digits");
  960. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x.p"), "Significand has no digits");
  961. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.p"), "Significand has no digits");
  962. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.p"), "Significand has no digits");
  963. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x.p+"), "Significand has no digits");
  964. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.p+"), "Significand has no digits");
  965. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.p+"), "Significand has no digits");
  966. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x.p-"), "Significand has no digits");
  967. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.p-"), "Significand has no digits");
  968. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.p-"), "Significand has no digits");
  969. }
  970. TEST(APFloatTest, StringHexadecimalExponentDeath) {
  971. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1p"), "Exponent has no digits");
  972. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1p"), "Exponent has no digits");
  973. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1p"), "Exponent has no digits");
  974. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1p+"), "Exponent has no digits");
  975. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1p+"), "Exponent has no digits");
  976. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1p+"), "Exponent has no digits");
  977. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1p-"), "Exponent has no digits");
  978. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1p-"), "Exponent has no digits");
  979. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1p-"), "Exponent has no digits");
  980. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.p"), "Exponent has no digits");
  981. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.p"), "Exponent has no digits");
  982. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.p"), "Exponent has no digits");
  983. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.p+"), "Exponent has no digits");
  984. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.p+"), "Exponent has no digits");
  985. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.p+"), "Exponent has no digits");
  986. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.p-"), "Exponent has no digits");
  987. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.p-"), "Exponent has no digits");
  988. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.p-"), "Exponent has no digits");
  989. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x.1p"), "Exponent has no digits");
  990. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.1p"), "Exponent has no digits");
  991. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.1p"), "Exponent has no digits");
  992. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x.1p+"), "Exponent has no digits");
  993. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.1p+"), "Exponent has no digits");
  994. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.1p+"), "Exponent has no digits");
  995. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x.1p-"), "Exponent has no digits");
  996. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.1p-"), "Exponent has no digits");
  997. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.1p-"), "Exponent has no digits");
  998. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.1p"), "Exponent has no digits");
  999. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.1p"), "Exponent has no digits");
  1000. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.1p"), "Exponent has no digits");
  1001. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.1p+"), "Exponent has no digits");
  1002. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.1p+"), "Exponent has no digits");
  1003. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.1p+"), "Exponent has no digits");
  1004. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.1p-"), "Exponent has no digits");
  1005. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.1p-"), "Exponent has no digits");
  1006. EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.1p-"), "Exponent has no digits");
  1007. }
  1008. #endif
  1009. #endif
  1010. TEST(APFloatTest, exactInverse) {
  1011. APFloat inv(0.0f);
  1012. // Trivial operation.
  1013. EXPECT_TRUE(APFloat(2.0).getExactInverse(&inv));
  1014. EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(0.5)));
  1015. EXPECT_TRUE(APFloat(2.0f).getExactInverse(&inv));
  1016. EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(0.5f)));
  1017. EXPECT_TRUE(APFloat(APFloat::IEEEquad, "2.0").getExactInverse(&inv));
  1018. EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(APFloat::IEEEquad, "0.5")));
  1019. EXPECT_TRUE(APFloat(APFloat::PPCDoubleDouble, "2.0").getExactInverse(&inv));
  1020. EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(APFloat::PPCDoubleDouble, "0.5")));
  1021. EXPECT_TRUE(APFloat(APFloat::x87DoubleExtended, "2.0").getExactInverse(&inv));
  1022. EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(APFloat::x87DoubleExtended, "0.5")));
  1023. // FLT_MIN
  1024. EXPECT_TRUE(APFloat(1.17549435e-38f).getExactInverse(&inv));
  1025. EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(8.5070592e+37f)));
  1026. // Large float, inverse is a denormal.
  1027. EXPECT_FALSE(APFloat(1.7014118e38f).getExactInverse(nullptr));
  1028. // Zero
  1029. EXPECT_FALSE(APFloat(0.0).getExactInverse(nullptr));
  1030. // Denormalized float
  1031. EXPECT_FALSE(APFloat(1.40129846e-45f).getExactInverse(nullptr));
  1032. }
  1033. TEST(APFloatTest, roundToIntegral) {
  1034. APFloat T(-0.5), S(3.14), R(APFloat::getLargest(APFloat::IEEEdouble)), P(0.0);
  1035. P = T;
  1036. P.roundToIntegral(APFloat::rmTowardZero);
  1037. EXPECT_EQ(-0.0, P.convertToDouble());
  1038. P = T;
  1039. P.roundToIntegral(APFloat::rmTowardNegative);
  1040. EXPECT_EQ(-1.0, P.convertToDouble());
  1041. P = T;
  1042. P.roundToIntegral(APFloat::rmTowardPositive);
  1043. EXPECT_EQ(-0.0, P.convertToDouble());
  1044. P = T;
  1045. P.roundToIntegral(APFloat::rmNearestTiesToEven);
  1046. EXPECT_EQ(-0.0, P.convertToDouble());
  1047. P = S;
  1048. P.roundToIntegral(APFloat::rmTowardZero);
  1049. EXPECT_EQ(3.0, P.convertToDouble());
  1050. P = S;
  1051. P.roundToIntegral(APFloat::rmTowardNegative);
  1052. EXPECT_EQ(3.0, P.convertToDouble());
  1053. P = S;
  1054. P.roundToIntegral(APFloat::rmTowardPositive);
  1055. EXPECT_EQ(4.0, P.convertToDouble());
  1056. P = S;
  1057. P.roundToIntegral(APFloat::rmNearestTiesToEven);
  1058. EXPECT_EQ(3.0, P.convertToDouble());
  1059. P = R;
  1060. P.roundToIntegral(APFloat::rmTowardZero);
  1061. EXPECT_EQ(R.convertToDouble(), P.convertToDouble());
  1062. P = R;
  1063. P.roundToIntegral(APFloat::rmTowardNegative);
  1064. EXPECT_EQ(R.convertToDouble(), P.convertToDouble());
  1065. P = R;
  1066. P.roundToIntegral(APFloat::rmTowardPositive);
  1067. EXPECT_EQ(R.convertToDouble(), P.convertToDouble());
  1068. P = R;
  1069. P.roundToIntegral(APFloat::rmNearestTiesToEven);
  1070. EXPECT_EQ(R.convertToDouble(), P.convertToDouble());
  1071. P = APFloat::getZero(APFloat::IEEEdouble);
  1072. P.roundToIntegral(APFloat::rmTowardZero);
  1073. EXPECT_EQ(0.0, P.convertToDouble());
  1074. P = APFloat::getZero(APFloat::IEEEdouble, true);
  1075. P.roundToIntegral(APFloat::rmTowardZero);
  1076. EXPECT_EQ(-0.0, P.convertToDouble());
  1077. P = APFloat::getNaN(APFloat::IEEEdouble);
  1078. P.roundToIntegral(APFloat::rmTowardZero);
  1079. EXPECT_TRUE(std::isnan(P.convertToDouble()));
  1080. P = APFloat::getInf(APFloat::IEEEdouble);
  1081. P.roundToIntegral(APFloat::rmTowardZero);
  1082. EXPECT_TRUE(std::isinf(P.convertToDouble()) && P.convertToDouble() > 0.0);
  1083. P = APFloat::getInf(APFloat::IEEEdouble, true);
  1084. P.roundToIntegral(APFloat::rmTowardZero);
  1085. EXPECT_TRUE(std::isinf(P.convertToDouble()) && P.convertToDouble() < 0.0);
  1086. }
  1087. TEST(APFloatTest, getLargest) {
  1088. EXPECT_EQ(3.402823466e+38f, APFloat::getLargest(APFloat::IEEEsingle).convertToFloat());
  1089. EXPECT_EQ(1.7976931348623158e+308, APFloat::getLargest(APFloat::IEEEdouble).convertToDouble());
  1090. }
  1091. TEST(APFloatTest, getSmallest) {
  1092. APFloat test = APFloat::getSmallest(APFloat::IEEEsingle, false);
  1093. APFloat expected = APFloat(APFloat::IEEEsingle, "0x0.000002p-126");
  1094. EXPECT_FALSE(test.isNegative());
  1095. EXPECT_TRUE(test.isFiniteNonZero());
  1096. EXPECT_TRUE(test.isDenormal());
  1097. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  1098. test = APFloat::getSmallest(APFloat::IEEEsingle, true);
  1099. expected = APFloat(APFloat::IEEEsingle, "-0x0.000002p-126");
  1100. EXPECT_TRUE(test.isNegative());
  1101. EXPECT_TRUE(test.isFiniteNonZero());
  1102. EXPECT_TRUE(test.isDenormal());
  1103. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  1104. test = APFloat::getSmallest(APFloat::IEEEquad, false);
  1105. expected = APFloat(APFloat::IEEEquad, "0x0.0000000000000000000000000001p-16382");
  1106. EXPECT_FALSE(test.isNegative());
  1107. EXPECT_TRUE(test.isFiniteNonZero());
  1108. EXPECT_TRUE(test.isDenormal());
  1109. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  1110. test = APFloat::getSmallest(APFloat::IEEEquad, true);
  1111. expected = APFloat(APFloat::IEEEquad, "-0x0.0000000000000000000000000001p-16382");
  1112. EXPECT_TRUE(test.isNegative());
  1113. EXPECT_TRUE(test.isFiniteNonZero());
  1114. EXPECT_TRUE(test.isDenormal());
  1115. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  1116. }
  1117. TEST(APFloatTest, getSmallestNormalized) {
  1118. APFloat test = APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
  1119. APFloat expected = APFloat(APFloat::IEEEsingle, "0x1p-126");
  1120. EXPECT_FALSE(test.isNegative());
  1121. EXPECT_TRUE(test.isFiniteNonZero());
  1122. EXPECT_FALSE(test.isDenormal());
  1123. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  1124. test = APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
  1125. expected = APFloat(APFloat::IEEEsingle, "-0x1p-126");
  1126. EXPECT_TRUE(test.isNegative());
  1127. EXPECT_TRUE(test.isFiniteNonZero());
  1128. EXPECT_FALSE(test.isDenormal());
  1129. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  1130. test = APFloat::getSmallestNormalized(APFloat::IEEEquad, false);
  1131. expected = APFloat(APFloat::IEEEquad, "0x1p-16382");
  1132. EXPECT_FALSE(test.isNegative());
  1133. EXPECT_TRUE(test.isFiniteNonZero());
  1134. EXPECT_FALSE(test.isDenormal());
  1135. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  1136. test = APFloat::getSmallestNormalized(APFloat::IEEEquad, true);
  1137. expected = APFloat(APFloat::IEEEquad, "-0x1p-16382");
  1138. EXPECT_TRUE(test.isNegative());
  1139. EXPECT_TRUE(test.isFiniteNonZero());
  1140. EXPECT_FALSE(test.isDenormal());
  1141. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  1142. }
  1143. TEST(APFloatTest, getZero) {
  1144. struct {
  1145. const fltSemantics *semantics;
  1146. const bool sign;
  1147. const unsigned long long bitPattern[2];
  1148. const unsigned bitPatternLength;
  1149. } const GetZeroTest[] = {
  1150. { &APFloat::IEEEhalf, false, {0, 0}, 1},
  1151. { &APFloat::IEEEhalf, true, {0x8000ULL, 0}, 1},
  1152. { &APFloat::IEEEsingle, false, {0, 0}, 1},
  1153. { &APFloat::IEEEsingle, true, {0x80000000ULL, 0}, 1},
  1154. { &APFloat::IEEEdouble, false, {0, 0}, 1},
  1155. { &APFloat::IEEEdouble, true, {0x8000000000000000ULL, 0}, 1},
  1156. { &APFloat::IEEEquad, false, {0, 0}, 2},
  1157. { &APFloat::IEEEquad, true, {0, 0x8000000000000000ULL}, 2},
  1158. { &APFloat::PPCDoubleDouble, false, {0, 0}, 2},
  1159. { &APFloat::PPCDoubleDouble, true, {0x8000000000000000ULL, 0}, 2},
  1160. { &APFloat::x87DoubleExtended, false, {0, 0}, 2},
  1161. { &APFloat::x87DoubleExtended, true, {0, 0x8000ULL}, 2},
  1162. };
  1163. const unsigned NumGetZeroTests = 12;
  1164. for (unsigned i = 0; i < NumGetZeroTests; ++i) {
  1165. APFloat test = APFloat::getZero(*GetZeroTest[i].semantics,
  1166. GetZeroTest[i].sign);
  1167. const char *pattern = GetZeroTest[i].sign? "-0x0p+0" : "0x0p+0";
  1168. APFloat expected = APFloat(*GetZeroTest[i].semantics,
  1169. pattern);
  1170. EXPECT_TRUE(test.isZero());
  1171. EXPECT_TRUE(GetZeroTest[i].sign? test.isNegative() : !test.isNegative());
  1172. EXPECT_TRUE(test.bitwiseIsEqual(expected));
  1173. for (unsigned j = 0, je = GetZeroTest[i].bitPatternLength; j < je; ++j) {
  1174. EXPECT_EQ(GetZeroTest[i].bitPattern[j],
  1175. test.bitcastToAPInt().getRawData()[j]);
  1176. }
  1177. }
  1178. }
  1179. TEST(APFloatTest, copySign) {
  1180. EXPECT_TRUE(APFloat(-42.0).bitwiseIsEqual(
  1181. APFloat::copySign(APFloat(42.0), APFloat(-1.0))));
  1182. EXPECT_TRUE(APFloat(42.0).bitwiseIsEqual(
  1183. APFloat::copySign(APFloat(-42.0), APFloat(1.0))));
  1184. EXPECT_TRUE(APFloat(-42.0).bitwiseIsEqual(
  1185. APFloat::copySign(APFloat(-42.0), APFloat(-1.0))));
  1186. EXPECT_TRUE(APFloat(42.0).bitwiseIsEqual(
  1187. APFloat::copySign(APFloat(42.0), APFloat(1.0))));
  1188. }
  1189. TEST(APFloatTest, convert) {
  1190. bool losesInfo;
  1191. APFloat test(APFloat::IEEEdouble, "1.0");
  1192. test.convert(APFloat::IEEEsingle, APFloat::rmNearestTiesToEven, &losesInfo);
  1193. EXPECT_EQ(1.0f, test.convertToFloat());
  1194. EXPECT_FALSE(losesInfo);
  1195. test = APFloat(APFloat::x87DoubleExtended, "0x1p-53");
  1196. test.add(APFloat(APFloat::x87DoubleExtended, "1.0"), APFloat::rmNearestTiesToEven);
  1197. test.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, &losesInfo);
  1198. EXPECT_EQ(1.0, test.convertToDouble());
  1199. EXPECT_TRUE(losesInfo);
  1200. test = APFloat(APFloat::IEEEquad, "0x1p-53");
  1201. test.add(APFloat(APFloat::IEEEquad, "1.0"), APFloat::rmNearestTiesToEven);
  1202. test.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, &losesInfo);
  1203. EXPECT_EQ(1.0, test.convertToDouble());
  1204. EXPECT_TRUE(losesInfo);
  1205. test = APFloat(APFloat::x87DoubleExtended, "0xf.fffffffp+28");
  1206. test.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, &losesInfo);
  1207. EXPECT_EQ(4294967295.0, test.convertToDouble());
  1208. EXPECT_FALSE(losesInfo);
  1209. test = APFloat::getSNaN(APFloat::IEEEsingle);
  1210. APFloat X87SNaN = APFloat::getSNaN(APFloat::x87DoubleExtended);
  1211. test.convert(APFloat::x87DoubleExtended, APFloat::rmNearestTiesToEven,
  1212. &losesInfo);
  1213. EXPECT_TRUE(test.bitwiseIsEqual(X87SNaN));
  1214. EXPECT_FALSE(losesInfo);
  1215. test = APFloat::getQNaN(APFloat::IEEEsingle);
  1216. APFloat X87QNaN = APFloat::getQNaN(APFloat::x87DoubleExtended);
  1217. test.convert(APFloat::x87DoubleExtended, APFloat::rmNearestTiesToEven,
  1218. &losesInfo);
  1219. EXPECT_TRUE(test.bitwiseIsEqual(X87QNaN));
  1220. EXPECT_FALSE(losesInfo);
  1221. test = APFloat::getSNaN(APFloat::x87DoubleExtended);
  1222. test.convert(APFloat::x87DoubleExtended, APFloat::rmNearestTiesToEven,
  1223. &losesInfo);
  1224. EXPECT_TRUE(test.bitwiseIsEqual(X87SNaN));
  1225. EXPECT_FALSE(losesInfo);
  1226. test = APFloat::getQNaN(APFloat::x87DoubleExtended);
  1227. test.convert(APFloat::x87DoubleExtended, APFloat::rmNearestTiesToEven,
  1228. &losesInfo);
  1229. EXPECT_TRUE(test.bitwiseIsEqual(X87QNaN));
  1230. EXPECT_FALSE(losesInfo);
  1231. }
  1232. TEST(APFloatTest, PPCDoubleDouble) {
  1233. APFloat test(APFloat::PPCDoubleDouble, "1.0");
  1234. EXPECT_EQ(0x3ff0000000000000ull, test.bitcastToAPInt().getRawData()[0]);
  1235. EXPECT_EQ(0x0000000000000000ull, test.bitcastToAPInt().getRawData()[1]);
  1236. test.divide(APFloat(APFloat::PPCDoubleDouble, "3.0"), APFloat::rmNearestTiesToEven);
  1237. EXPECT_EQ(0x3fd5555555555555ull, test.bitcastToAPInt().getRawData()[0]);
  1238. EXPECT_EQ(0x3c75555555555556ull, test.bitcastToAPInt().getRawData()[1]);
  1239. // LDBL_MAX
  1240. test = APFloat(APFloat::PPCDoubleDouble, "1.79769313486231580793728971405301e+308");
  1241. EXPECT_EQ(0x7fefffffffffffffull, test.bitcastToAPInt().getRawData()[0]);
  1242. EXPECT_EQ(0x7c8ffffffffffffeull, test.bitcastToAPInt().getRawData()[1]);
  1243. // LDBL_MIN
  1244. test = APFloat(APFloat::PPCDoubleDouble, "2.00416836000897277799610805135016e-292");
  1245. EXPECT_EQ(0x0360000000000000ull, test.bitcastToAPInt().getRawData()[0]);
  1246. EXPECT_EQ(0x0000000000000000ull, test.bitcastToAPInt().getRawData()[1]);
  1247. test = APFloat(APFloat::PPCDoubleDouble, "1.0");
  1248. test.add(APFloat(APFloat::PPCDoubleDouble, "0x1p-105"), APFloat::rmNearestTiesToEven);
  1249. EXPECT_EQ(0x3ff0000000000000ull, test.bitcastToAPInt().getRawData()[0]);
  1250. EXPECT_EQ(0x3960000000000000ull, test.bitcastToAPInt().getRawData()[1]);
  1251. test = APFloat(APFloat::PPCDoubleDouble, "1.0");
  1252. test.add(APFloat(APFloat::PPCDoubleDouble, "0x1p-106"), APFloat::rmNearestTiesToEven);
  1253. EXPECT_EQ(0x3ff0000000000000ull, test.bitcastToAPInt().getRawData()[0]);
  1254. #if 0 // XFAIL
  1255. // This is what we would expect with a true double-double implementation
  1256. EXPECT_EQ(0x3950000000000000ull, test.bitcastToAPInt().getRawData()[1]);
  1257. #else
  1258. // This is what we get with our 106-bit mantissa approximation
  1259. EXPECT_EQ(0x0000000000000000ull, test.bitcastToAPInt().getRawData()[1]);
  1260. #endif
  1261. }
  1262. TEST(APFloatTest, isNegative) {
  1263. APFloat t(APFloat::IEEEsingle, "0x1p+0");
  1264. EXPECT_FALSE(t.isNegative());
  1265. t = APFloat(APFloat::IEEEsingle, "-0x1p+0");
  1266. EXPECT_TRUE(t.isNegative());
  1267. EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, false).isNegative());
  1268. EXPECT_TRUE(APFloat::getInf(APFloat::IEEEsingle, true).isNegative());
  1269. EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, false).isNegative());
  1270. EXPECT_TRUE(APFloat::getZero(APFloat::IEEEsingle, true).isNegative());
  1271. EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, false).isNegative());
  1272. EXPECT_TRUE(APFloat::getNaN(APFloat::IEEEsingle, true).isNegative());
  1273. EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, false).isNegative());
  1274. EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle, true).isNegative());
  1275. }
  1276. TEST(APFloatTest, isNormal) {
  1277. APFloat t(APFloat::IEEEsingle, "0x1p+0");
  1278. EXPECT_TRUE(t.isNormal());
  1279. EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, false).isNormal());
  1280. EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, false).isNormal());
  1281. EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, false).isNormal());
  1282. EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, false).isNormal());
  1283. EXPECT_FALSE(APFloat(APFloat::IEEEsingle, "0x1p-149").isNormal());
  1284. }
  1285. TEST(APFloatTest, isFinite) {
  1286. APFloat t(APFloat::IEEEsingle, "0x1p+0");
  1287. EXPECT_TRUE(t.isFinite());
  1288. EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, false).isFinite());
  1289. EXPECT_TRUE(APFloat::getZero(APFloat::IEEEsingle, false).isFinite());
  1290. EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, false).isFinite());
  1291. EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, false).isFinite());
  1292. EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "0x1p-149").isFinite());
  1293. }
  1294. TEST(APFloatTest, isInfinity) {
  1295. APFloat t(APFloat::IEEEsingle, "0x1p+0");
  1296. EXPECT_FALSE(t.isInfinity());
  1297. EXPECT_TRUE(APFloat::getInf(APFloat::IEEEsingle, false).isInfinity());
  1298. EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, false).isInfinity());
  1299. EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, false).isInfinity());
  1300. EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, false).isInfinity());
  1301. EXPECT_FALSE(APFloat(APFloat::IEEEsingle, "0x1p-149").isInfinity());
  1302. }
  1303. TEST(APFloatTest, isNaN) {
  1304. APFloat t(APFloat::IEEEsingle, "0x1p+0");
  1305. EXPECT_FALSE(t.isNaN());
  1306. EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, false).isNaN());
  1307. EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, false).isNaN());
  1308. EXPECT_TRUE(APFloat::getNaN(APFloat::IEEEsingle, false).isNaN());
  1309. EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle, false).isNaN());
  1310. EXPECT_FALSE(APFloat(APFloat::IEEEsingle, "0x1p-149").isNaN());
  1311. }
  1312. TEST(APFloatTest, isFiniteNonZero) {
  1313. // Test positive/negative normal value.
  1314. EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "0x1p+0").isFiniteNonZero());
  1315. EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "-0x1p+0").isFiniteNonZero());
  1316. // Test positive/negative denormal value.
  1317. EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "0x1p-149").isFiniteNonZero());
  1318. EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "-0x1p-149").isFiniteNonZero());
  1319. // Test +/- Infinity.
  1320. EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, false).isFiniteNonZero());
  1321. EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, true).isFiniteNonZero());
  1322. // Test +/- Zero.
  1323. EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, false).isFiniteNonZero());
  1324. EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, true).isFiniteNonZero());
  1325. // Test +/- qNaN. +/- dont mean anything with qNaN but paranoia can't hurt in
  1326. // this instance.
  1327. EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, false).isFiniteNonZero());
  1328. EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, true).isFiniteNonZero());
  1329. // Test +/- sNaN. +/- dont mean anything with sNaN but paranoia can't hurt in
  1330. // this instance.
  1331. EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, false).isFiniteNonZero());
  1332. EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, true).isFiniteNonZero());
  1333. }
  1334. TEST(APFloatTest, add) {
  1335. // Test Special Cases against each other and normal values.
  1336. // TODOS/NOTES:
  1337. // 1. Since we perform only default exception handling all operations with
  1338. // signaling NaNs should have a result that is a quiet NaN. Currently they
  1339. // return sNaN.
  1340. APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false);
  1341. APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true);
  1342. APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false);
  1343. APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true);
  1344. APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle, false);
  1345. APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle, false);
  1346. APFloat PNormalValue = APFloat(APFloat::IEEEsingle, "0x1p+0");
  1347. APFloat MNormalValue = APFloat(APFloat::IEEEsingle, "-0x1p+0");
  1348. APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle, false);
  1349. APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle, true);
  1350. APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, false);
  1351. APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, true);
  1352. APFloat PSmallestNormalized =
  1353. APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
  1354. APFloat MSmallestNormalized =
  1355. APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
  1356. const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact;
  1357. const unsigned NumTests = 169;
  1358. struct {
  1359. APFloat x;
  1360. APFloat y;
  1361. const char *result;
  1362. int status;
  1363. int category;
  1364. } SpecialCaseTests[NumTests] = {
  1365. { PInf, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1366. { PInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1367. { PInf, PZero, "inf", APFloat::opOK, APFloat::fcInfinity },
  1368. { PInf, MZero, "inf", APFloat::opOK, APFloat::fcInfinity },
  1369. { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  1370. #if 0
  1371. // See Note 1.
  1372. { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1373. #endif
  1374. { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  1375. { PInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  1376. { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  1377. { PInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  1378. { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  1379. { PInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  1380. { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
  1381. { PInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
  1382. { MInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1383. { MInf, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1384. { MInf, PZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1385. { MInf, MZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1386. { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  1387. #if 0
  1388. // See Note 1.
  1389. { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1390. #endif
  1391. { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1392. { MInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1393. { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1394. { MInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1395. { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1396. { MInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1397. { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1398. { MInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1399. { PZero, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1400. { PZero, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1401. { PZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1402. { PZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1403. { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  1404. #if 0
  1405. // See Note 1.
  1406. { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1407. #endif
  1408. { PZero, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
  1409. { PZero, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
  1410. { PZero, PLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  1411. { PZero, MLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  1412. { PZero, PSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
  1413. { PZero, MSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
  1414. { PZero, PSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
  1415. { PZero, MSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
  1416. { MZero, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1417. { MZero, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1418. { MZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1419. { MZero, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  1420. { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  1421. #if 0
  1422. // See Note 1.
  1423. { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1424. #endif
  1425. { MZero, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
  1426. { MZero, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
  1427. { MZero, PLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  1428. { MZero, MLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  1429. { MZero, PSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
  1430. { MZero, MSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
  1431. { MZero, PSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
  1432. { MZero, MSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
  1433. { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN },
  1434. { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN },
  1435. { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN },
  1436. { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN },
  1437. { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  1438. #if 0
  1439. // See Note 1.
  1440. { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1441. #endif
  1442. { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
  1443. { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
  1444. { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
  1445. { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
  1446. { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
  1447. { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
  1448. { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
  1449. { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
  1450. #if 0
  1451. // See Note 1.
  1452. { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1453. { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1454. { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1455. { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1456. { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1457. { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1458. { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1459. { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1460. { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1461. { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1462. { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1463. { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1464. { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1465. { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1466. #endif
  1467. { PNormalValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1468. { PNormalValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1469. { PNormalValue, PZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
  1470. { PNormalValue, MZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
  1471. { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  1472. #if 0
  1473. // See Note 1.
  1474. { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1475. #endif
  1476. { PNormalValue, PNormalValue, "0x1p+1", APFloat::opOK, APFloat::fcNormal },
  1477. { PNormalValue, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1478. { PNormalValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1479. { PNormalValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1480. { PNormalValue, PSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1481. { PNormalValue, MSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1482. { PNormalValue, PSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1483. { PNormalValue, MSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1484. { MNormalValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1485. { MNormalValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1486. { MNormalValue, PZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
  1487. { MNormalValue, MZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
  1488. { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  1489. #if 0
  1490. // See Note 1.
  1491. { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1492. #endif
  1493. { MNormalValue, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1494. { MNormalValue, MNormalValue, "-0x1p+1", APFloat::opOK, APFloat::fcNormal },
  1495. { MNormalValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1496. { MNormalValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1497. { MNormalValue, PSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1498. { MNormalValue, MSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1499. { MNormalValue, PSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1500. { MNormalValue, MSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1501. { PLargestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1502. { PLargestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1503. { PLargestValue, PZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  1504. { PLargestValue, MZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  1505. { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  1506. #if 0
  1507. // See Note 1.
  1508. { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1509. #endif
  1510. { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1511. { PLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1512. { PLargestValue, PLargestValue, "inf", OverflowStatus, APFloat::fcInfinity },
  1513. { PLargestValue, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1514. { PLargestValue, PSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1515. { PLargestValue, MSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1516. { PLargestValue, PSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1517. { PLargestValue, MSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1518. { MLargestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1519. { MLargestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1520. { MLargestValue, PZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  1521. { MLargestValue, MZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  1522. { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  1523. #if 0
  1524. // See Note 1.
  1525. { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1526. #endif
  1527. { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1528. { MLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1529. { MLargestValue, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1530. { MLargestValue, MLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
  1531. { MLargestValue, PSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1532. { MLargestValue, MSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1533. { MLargestValue, PSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1534. { MLargestValue, MSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1535. { PSmallestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1536. { PSmallestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1537. { PSmallestValue, PZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
  1538. { PSmallestValue, MZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
  1539. { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  1540. #if 0
  1541. // See Note 1.
  1542. { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1543. #endif
  1544. { PSmallestValue, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1545. { PSmallestValue, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1546. { PSmallestValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1547. { PSmallestValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1548. { PSmallestValue, PSmallestValue, "0x1p-148", APFloat::opOK, APFloat::fcNormal },
  1549. { PSmallestValue, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1550. { PSmallestValue, PSmallestNormalized, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
  1551. { PSmallestValue, MSmallestNormalized, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
  1552. { MSmallestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1553. { MSmallestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1554. { MSmallestValue, PZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
  1555. { MSmallestValue, MZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
  1556. { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  1557. #if 0
  1558. // See Note 1.
  1559. { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1560. #endif
  1561. { MSmallestValue, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1562. { MSmallestValue, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1563. { MSmallestValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1564. { MSmallestValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1565. { MSmallestValue, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1566. { MSmallestValue, MSmallestValue, "-0x1p-148", APFloat::opOK, APFloat::fcNormal },
  1567. { MSmallestValue, PSmallestNormalized, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
  1568. { MSmallestValue, MSmallestNormalized, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
  1569. { PSmallestNormalized, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1570. { PSmallestNormalized, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1571. { PSmallestNormalized, PZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
  1572. { PSmallestNormalized, MZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
  1573. { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  1574. #if 0
  1575. // See Note 1.
  1576. { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1577. #endif
  1578. { PSmallestNormalized, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1579. { PSmallestNormalized, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1580. { PSmallestNormalized, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1581. { PSmallestNormalized, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1582. { PSmallestNormalized, PSmallestValue, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
  1583. { PSmallestNormalized, MSmallestValue, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
  1584. { PSmallestNormalized, PSmallestNormalized, "0x1p-125", APFloat::opOK, APFloat::fcNormal },
  1585. { PSmallestNormalized, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1586. { MSmallestNormalized, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1587. { MSmallestNormalized, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1588. { MSmallestNormalized, PZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
  1589. { MSmallestNormalized, MZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
  1590. { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  1591. #if 0
  1592. // See Note 1.
  1593. { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1594. #endif
  1595. { MSmallestNormalized, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1596. { MSmallestNormalized, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1597. { MSmallestNormalized, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1598. { MSmallestNormalized, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1599. { MSmallestNormalized, PSmallestValue, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
  1600. { MSmallestNormalized, MSmallestValue, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
  1601. { MSmallestNormalized, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1602. { MSmallestNormalized, MSmallestNormalized, "-0x1p-125", APFloat::opOK, APFloat::fcNormal }
  1603. };
  1604. for (size_t i = 0; i < NumTests; ++i) {
  1605. APFloat x(SpecialCaseTests[i].x);
  1606. APFloat y(SpecialCaseTests[i].y);
  1607. APFloat::opStatus status = x.add(y, APFloat::rmNearestTiesToEven);
  1608. APFloat result(APFloat::IEEEsingle, SpecialCaseTests[i].result);
  1609. EXPECT_TRUE(result.bitwiseIsEqual(x));
  1610. EXPECT_TRUE((int)status == SpecialCaseTests[i].status);
  1611. EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category);
  1612. }
  1613. }
  1614. TEST(APFloatTest, subtract) {
  1615. // Test Special Cases against each other and normal values.
  1616. // TODOS/NOTES:
  1617. // 1. Since we perform only default exception handling all operations with
  1618. // signaling NaNs should have a result that is a quiet NaN. Currently they
  1619. // return sNaN.
  1620. APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false);
  1621. APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true);
  1622. APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false);
  1623. APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true);
  1624. APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle, false);
  1625. APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle, false);
  1626. APFloat PNormalValue = APFloat(APFloat::IEEEsingle, "0x1p+0");
  1627. APFloat MNormalValue = APFloat(APFloat::IEEEsingle, "-0x1p+0");
  1628. APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle, false);
  1629. APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle, true);
  1630. APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, false);
  1631. APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, true);
  1632. APFloat PSmallestNormalized =
  1633. APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
  1634. APFloat MSmallestNormalized =
  1635. APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
  1636. const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact;
  1637. const unsigned NumTests = 169;
  1638. struct {
  1639. APFloat x;
  1640. APFloat y;
  1641. const char *result;
  1642. int status;
  1643. int category;
  1644. } SpecialCaseTests[NumTests] = {
  1645. { PInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1646. { PInf, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1647. { PInf, PZero, "inf", APFloat::opOK, APFloat::fcInfinity },
  1648. { PInf, MZero, "inf", APFloat::opOK, APFloat::fcInfinity },
  1649. { PInf, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
  1650. #if 0
  1651. // See Note 1.
  1652. { PInf, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1653. #endif
  1654. { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  1655. { PInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  1656. { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  1657. { PInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  1658. { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  1659. { PInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  1660. { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
  1661. { PInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
  1662. { MInf, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1663. { MInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1664. { MInf, PZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1665. { MInf, MZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1666. { MInf, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
  1667. #if 0
  1668. // See Note 1.
  1669. { MInf, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1670. #endif
  1671. { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1672. { MInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1673. { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1674. { MInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1675. { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1676. { MInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1677. { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1678. { MInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1679. { PZero, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1680. { PZero, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1681. { PZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1682. { PZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1683. { PZero, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
  1684. #if 0
  1685. // See Note 1.
  1686. { PZero, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1687. #endif
  1688. { PZero, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
  1689. { PZero, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
  1690. { PZero, PLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  1691. { PZero, MLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  1692. { PZero, PSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
  1693. { PZero, MSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
  1694. { PZero, PSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
  1695. { PZero, MSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
  1696. { MZero, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1697. { MZero, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1698. { MZero, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  1699. { MZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1700. { MZero, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
  1701. #if 0
  1702. // See Note 1.
  1703. { MZero, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1704. #endif
  1705. { MZero, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
  1706. { MZero, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
  1707. { MZero, PLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  1708. { MZero, MLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  1709. { MZero, PSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
  1710. { MZero, MSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
  1711. { MZero, PSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
  1712. { MZero, MSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
  1713. { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN },
  1714. { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN },
  1715. { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN },
  1716. { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN },
  1717. { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  1718. #if 0
  1719. // See Note 1.
  1720. { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1721. #endif
  1722. { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
  1723. { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
  1724. { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
  1725. { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
  1726. { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
  1727. { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
  1728. { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
  1729. { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
  1730. #if 0
  1731. // See Note 1.
  1732. { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1733. { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1734. { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1735. { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1736. { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1737. { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1738. { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1739. { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1740. { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1741. { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1742. { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1743. { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1744. { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1745. { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1746. #endif
  1747. { PNormalValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1748. { PNormalValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1749. { PNormalValue, PZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
  1750. { PNormalValue, MZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
  1751. { PNormalValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
  1752. #if 0
  1753. // See Note 1.
  1754. { PNormalValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1755. #endif
  1756. { PNormalValue, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1757. { PNormalValue, MNormalValue, "0x1p+1", APFloat::opOK, APFloat::fcNormal },
  1758. { PNormalValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1759. { PNormalValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1760. { PNormalValue, PSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1761. { PNormalValue, MSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1762. { PNormalValue, PSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1763. { PNormalValue, MSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1764. { MNormalValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1765. { MNormalValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1766. { MNormalValue, PZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
  1767. { MNormalValue, MZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
  1768. { MNormalValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
  1769. #if 0
  1770. // See Note 1.
  1771. { MNormalValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1772. #endif
  1773. { MNormalValue, PNormalValue, "-0x1p+1", APFloat::opOK, APFloat::fcNormal },
  1774. { MNormalValue, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1775. { MNormalValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1776. { MNormalValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1777. { MNormalValue, PSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1778. { MNormalValue, MSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1779. { MNormalValue, PSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1780. { MNormalValue, MSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1781. { PLargestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1782. { PLargestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1783. { PLargestValue, PZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  1784. { PLargestValue, MZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  1785. { PLargestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
  1786. #if 0
  1787. // See Note 1.
  1788. { PLargestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1789. #endif
  1790. { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1791. { PLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1792. { PLargestValue, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1793. { PLargestValue, MLargestValue, "inf", OverflowStatus, APFloat::fcInfinity },
  1794. { PLargestValue, PSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1795. { PLargestValue, MSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1796. { PLargestValue, PSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1797. { PLargestValue, MSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1798. { MLargestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1799. { MLargestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1800. { MLargestValue, PZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  1801. { MLargestValue, MZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  1802. { MLargestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
  1803. #if 0
  1804. // See Note 1.
  1805. { MLargestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1806. #endif
  1807. { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1808. { MLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1809. { MLargestValue, PLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
  1810. { MLargestValue, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1811. { MLargestValue, PSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1812. { MLargestValue, MSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1813. { MLargestValue, PSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1814. { MLargestValue, MSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1815. { PSmallestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1816. { PSmallestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1817. { PSmallestValue, PZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
  1818. { PSmallestValue, MZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
  1819. { PSmallestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
  1820. #if 0
  1821. // See Note 1.
  1822. { PSmallestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1823. #endif
  1824. { PSmallestValue, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1825. { PSmallestValue, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1826. { PSmallestValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1827. { PSmallestValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1828. { PSmallestValue, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1829. { PSmallestValue, MSmallestValue, "0x1p-148", APFloat::opOK, APFloat::fcNormal },
  1830. { PSmallestValue, PSmallestNormalized, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
  1831. { PSmallestValue, MSmallestNormalized, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
  1832. { MSmallestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1833. { MSmallestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1834. { MSmallestValue, PZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
  1835. { MSmallestValue, MZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
  1836. { MSmallestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
  1837. #if 0
  1838. // See Note 1.
  1839. { MSmallestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1840. #endif
  1841. { MSmallestValue, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1842. { MSmallestValue, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1843. { MSmallestValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1844. { MSmallestValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1845. { MSmallestValue, PSmallestValue, "-0x1p-148", APFloat::opOK, APFloat::fcNormal },
  1846. { MSmallestValue, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1847. { MSmallestValue, PSmallestNormalized, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
  1848. { MSmallestValue, MSmallestNormalized, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
  1849. { PSmallestNormalized, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1850. { PSmallestNormalized, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1851. { PSmallestNormalized, PZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
  1852. { PSmallestNormalized, MZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
  1853. { PSmallestNormalized, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
  1854. #if 0
  1855. // See Note 1.
  1856. { PSmallestNormalized, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1857. #endif
  1858. { PSmallestNormalized, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1859. { PSmallestNormalized, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1860. { PSmallestNormalized, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1861. { PSmallestNormalized, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1862. { PSmallestNormalized, PSmallestValue, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
  1863. { PSmallestNormalized, MSmallestValue, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
  1864. { PSmallestNormalized, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1865. { PSmallestNormalized, MSmallestNormalized, "0x1p-125", APFloat::opOK, APFloat::fcNormal },
  1866. { MSmallestNormalized, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1867. { MSmallestNormalized, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1868. { MSmallestNormalized, PZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
  1869. { MSmallestNormalized, MZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
  1870. { MSmallestNormalized, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
  1871. #if 0
  1872. // See Note 1.
  1873. { MSmallestNormalized, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1874. #endif
  1875. { MSmallestNormalized, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1876. { MSmallestNormalized, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
  1877. { MSmallestNormalized, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1878. { MSmallestNormalized, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
  1879. { MSmallestNormalized, PSmallestValue, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
  1880. { MSmallestNormalized, MSmallestValue, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
  1881. { MSmallestNormalized, PSmallestNormalized, "-0x1p-125", APFloat::opOK, APFloat::fcNormal },
  1882. { MSmallestNormalized, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero }
  1883. };
  1884. for (size_t i = 0; i < NumTests; ++i) {
  1885. APFloat x(SpecialCaseTests[i].x);
  1886. APFloat y(SpecialCaseTests[i].y);
  1887. APFloat::opStatus status = x.subtract(y, APFloat::rmNearestTiesToEven);
  1888. APFloat result(APFloat::IEEEsingle, SpecialCaseTests[i].result);
  1889. EXPECT_TRUE(result.bitwiseIsEqual(x));
  1890. EXPECT_TRUE((int)status == SpecialCaseTests[i].status);
  1891. EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category);
  1892. }
  1893. }
  1894. TEST(APFloatTest, multiply) {
  1895. // Test Special Cases against each other and normal values.
  1896. // TODOS/NOTES:
  1897. // 1. Since we perform only default exception handling all operations with
  1898. // signaling NaNs should have a result that is a quiet NaN. Currently they
  1899. // return sNaN.
  1900. APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false);
  1901. APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true);
  1902. APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false);
  1903. APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true);
  1904. APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle, false);
  1905. APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle, false);
  1906. APFloat PNormalValue = APFloat(APFloat::IEEEsingle, "0x1p+0");
  1907. APFloat MNormalValue = APFloat(APFloat::IEEEsingle, "-0x1p+0");
  1908. APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle, false);
  1909. APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle, true);
  1910. APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, false);
  1911. APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, true);
  1912. APFloat PSmallestNormalized =
  1913. APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
  1914. APFloat MSmallestNormalized =
  1915. APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
  1916. const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact;
  1917. const int UnderflowStatus = APFloat::opUnderflow | APFloat::opInexact;
  1918. const unsigned NumTests = 169;
  1919. struct {
  1920. APFloat x;
  1921. APFloat y;
  1922. const char *result;
  1923. int status;
  1924. int category;
  1925. } SpecialCaseTests[NumTests] = {
  1926. { PInf, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1927. { PInf, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1928. { PInf, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1929. { PInf, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1930. { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  1931. #if 0
  1932. // See Note 1.
  1933. { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1934. #endif
  1935. { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  1936. { PInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1937. { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  1938. { PInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1939. { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  1940. { PInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1941. { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
  1942. { PInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1943. { MInf, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1944. { MInf, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  1945. { MInf, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1946. { MInf, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1947. { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  1948. #if 0
  1949. // See Note 1.
  1950. { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1951. #endif
  1952. { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1953. { MInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  1954. { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1955. { MInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  1956. { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1957. { MInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  1958. { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
  1959. { MInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
  1960. { PZero, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1961. { PZero, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1962. { PZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1963. { PZero, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  1964. { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  1965. #if 0
  1966. // See Note 1.
  1967. { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1968. #endif
  1969. { PZero, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1970. { PZero, MNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  1971. { PZero, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1972. { PZero, MLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  1973. { PZero, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1974. { PZero, MSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  1975. { PZero, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1976. { PZero, MSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  1977. { MZero, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1978. { MZero, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1979. { MZero, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  1980. { MZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1981. { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  1982. #if 0
  1983. // See Note 1.
  1984. { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  1985. #endif
  1986. { MZero, PNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  1987. { MZero, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1988. { MZero, PLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  1989. { MZero, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1990. { MZero, PSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  1991. { MZero, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1992. { MZero, PSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  1993. { MZero, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  1994. { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN },
  1995. { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN },
  1996. { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN },
  1997. { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN },
  1998. { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  1999. #if 0
  2000. // See Note 1.
  2001. { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2002. #endif
  2003. { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
  2004. { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
  2005. { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
  2006. { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
  2007. { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
  2008. { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
  2009. { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
  2010. { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
  2011. #if 0
  2012. // See Note 1.
  2013. { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2014. { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2015. { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2016. { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2017. { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2018. { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2019. { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2020. { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2021. { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2022. { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2023. { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2024. { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2025. { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2026. { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2027. #endif
  2028. { PNormalValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  2029. { PNormalValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  2030. { PNormalValue, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2031. { PNormalValue, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2032. { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  2033. #if 0
  2034. // See Note 1.
  2035. { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2036. #endif
  2037. { PNormalValue, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
  2038. { PNormalValue, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
  2039. { PNormalValue, PLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  2040. { PNormalValue, MLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  2041. { PNormalValue, PSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
  2042. { PNormalValue, MSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
  2043. { PNormalValue, PSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
  2044. { PNormalValue, MSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
  2045. { MNormalValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  2046. { MNormalValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  2047. { MNormalValue, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2048. { MNormalValue, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2049. { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  2050. #if 0
  2051. // See Note 1.
  2052. { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2053. #endif
  2054. { MNormalValue, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
  2055. { MNormalValue, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
  2056. { MNormalValue, PLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  2057. { MNormalValue, MLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  2058. { MNormalValue, PSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
  2059. { MNormalValue, MSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
  2060. { MNormalValue, PSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
  2061. { MNormalValue, MSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
  2062. { PLargestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  2063. { PLargestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  2064. { PLargestValue, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2065. { PLargestValue, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2066. { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  2067. #if 0
  2068. // See Note 1.
  2069. { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2070. #endif
  2071. { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  2072. { PLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  2073. { PLargestValue, PLargestValue, "inf", OverflowStatus, APFloat::fcInfinity },
  2074. { PLargestValue, MLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
  2075. { PLargestValue, PSmallestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
  2076. { PLargestValue, MSmallestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
  2077. { PLargestValue, PSmallestNormalized, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
  2078. { PLargestValue, MSmallestNormalized, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
  2079. { MLargestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  2080. { MLargestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  2081. { MLargestValue, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2082. { MLargestValue, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2083. { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  2084. #if 0
  2085. // See Note 1.
  2086. { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2087. #endif
  2088. { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  2089. { MLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  2090. { MLargestValue, PLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
  2091. { MLargestValue, MLargestValue, "inf", OverflowStatus, APFloat::fcInfinity },
  2092. { MLargestValue, PSmallestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
  2093. { MLargestValue, MSmallestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
  2094. { MLargestValue, PSmallestNormalized, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
  2095. { MLargestValue, MSmallestNormalized, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
  2096. { PSmallestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  2097. { PSmallestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  2098. { PSmallestValue, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2099. { PSmallestValue, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2100. { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  2101. #if 0
  2102. // See Note 1.
  2103. { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2104. #endif
  2105. { PSmallestValue, PNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
  2106. { PSmallestValue, MNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
  2107. { PSmallestValue, PLargestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
  2108. { PSmallestValue, MLargestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
  2109. { PSmallestValue, PSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
  2110. { PSmallestValue, MSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
  2111. { PSmallestValue, PSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero },
  2112. { PSmallestValue, MSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
  2113. { MSmallestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  2114. { MSmallestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  2115. { MSmallestValue, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2116. { MSmallestValue, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2117. { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  2118. #if 0
  2119. // See Note 1.
  2120. { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2121. #endif
  2122. { MSmallestValue, PNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
  2123. { MSmallestValue, MNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
  2124. { MSmallestValue, PLargestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
  2125. { MSmallestValue, MLargestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
  2126. { MSmallestValue, PSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
  2127. { MSmallestValue, MSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
  2128. { MSmallestValue, PSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
  2129. { MSmallestValue, MSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero },
  2130. { PSmallestNormalized, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  2131. { PSmallestNormalized, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  2132. { PSmallestNormalized, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2133. { PSmallestNormalized, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2134. { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  2135. #if 0
  2136. // See Note 1.
  2137. { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2138. #endif
  2139. { PSmallestNormalized, PNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
  2140. { PSmallestNormalized, MNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
  2141. { PSmallestNormalized, PLargestValue, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
  2142. { PSmallestNormalized, MLargestValue, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
  2143. { PSmallestNormalized, PSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
  2144. { PSmallestNormalized, MSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
  2145. { PSmallestNormalized, PSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero },
  2146. { PSmallestNormalized, MSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
  2147. { MSmallestNormalized, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
  2148. { MSmallestNormalized, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
  2149. { MSmallestNormalized, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2150. { MSmallestNormalized, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2151. { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  2152. #if 0
  2153. // See Note 1.
  2154. { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2155. #endif
  2156. { MSmallestNormalized, PNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
  2157. { MSmallestNormalized, MNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
  2158. { MSmallestNormalized, PLargestValue, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
  2159. { MSmallestNormalized, MLargestValue, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
  2160. { MSmallestNormalized, PSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
  2161. { MSmallestNormalized, MSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
  2162. { MSmallestNormalized, PSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
  2163. { MSmallestNormalized, MSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero }
  2164. };
  2165. for (size_t i = 0; i < NumTests; ++i) {
  2166. APFloat x(SpecialCaseTests[i].x);
  2167. APFloat y(SpecialCaseTests[i].y);
  2168. APFloat::opStatus status = x.multiply(y, APFloat::rmNearestTiesToEven);
  2169. APFloat result(APFloat::IEEEsingle, SpecialCaseTests[i].result);
  2170. EXPECT_TRUE(result.bitwiseIsEqual(x));
  2171. EXPECT_TRUE((int)status == SpecialCaseTests[i].status);
  2172. EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category);
  2173. }
  2174. }
  2175. TEST(APFloatTest, divide) {
  2176. // Test Special Cases against each other and normal values.
  2177. // TODOS/NOTES:
  2178. // 1. Since we perform only default exception handling all operations with
  2179. // signaling NaNs should have a result that is a quiet NaN. Currently they
  2180. // return sNaN.
  2181. APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false);
  2182. APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true);
  2183. APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false);
  2184. APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true);
  2185. APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle, false);
  2186. APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle, false);
  2187. APFloat PNormalValue = APFloat(APFloat::IEEEsingle, "0x1p+0");
  2188. APFloat MNormalValue = APFloat(APFloat::IEEEsingle, "-0x1p+0");
  2189. APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle, false);
  2190. APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle, true);
  2191. APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, false);
  2192. APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, true);
  2193. APFloat PSmallestNormalized =
  2194. APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
  2195. APFloat MSmallestNormalized =
  2196. APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
  2197. const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact;
  2198. const int UnderflowStatus = APFloat::opUnderflow | APFloat::opInexact;
  2199. const unsigned NumTests = 169;
  2200. struct {
  2201. APFloat x;
  2202. APFloat y;
  2203. const char *result;
  2204. int status;
  2205. int category;
  2206. } SpecialCaseTests[NumTests] = {
  2207. { PInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2208. { PInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2209. { PInf, PZero, "inf", APFloat::opOK, APFloat::fcInfinity },
  2210. { PInf, MZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
  2211. { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  2212. #if 0
  2213. // See Note 1.
  2214. { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2215. #endif
  2216. { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  2217. { PInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  2218. { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  2219. { PInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  2220. { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  2221. { PInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  2222. { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
  2223. { PInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
  2224. { MInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2225. { MInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2226. { MInf, PZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
  2227. { MInf, MZero, "inf", APFloat::opOK, APFloat::fcInfinity },
  2228. { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  2229. #if 0
  2230. // See Note 1.
  2231. { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2232. #endif
  2233. { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  2234. { MInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  2235. { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  2236. { MInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  2237. { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
  2238. { MInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
  2239. { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
  2240. { MInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
  2241. { PZero, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2242. { PZero, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2243. { PZero, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2244. { PZero, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2245. { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  2246. #if 0
  2247. // See Note 1.
  2248. { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2249. #endif
  2250. { PZero, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2251. { PZero, MNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2252. { PZero, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2253. { PZero, MLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2254. { PZero, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2255. { PZero, MSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2256. { PZero, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2257. { PZero, MSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2258. { MZero, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2259. { MZero, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2260. { MZero, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2261. { MZero, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2262. { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  2263. #if 0
  2264. // See Note 1.
  2265. { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2266. #endif
  2267. { MZero, PNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2268. { MZero, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2269. { MZero, PLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2270. { MZero, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2271. { MZero, PSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2272. { MZero, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2273. { MZero, PSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2274. { MZero, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2275. { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN },
  2276. { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN },
  2277. { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN },
  2278. { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN },
  2279. { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  2280. #if 0
  2281. // See Note 1.
  2282. { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2283. #endif
  2284. { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
  2285. { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
  2286. { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
  2287. { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
  2288. { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
  2289. { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
  2290. { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
  2291. { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
  2292. #if 0
  2293. // See Note 1.
  2294. { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2295. { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2296. { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2297. { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2298. { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2299. { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2300. { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2301. { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2302. { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2303. { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2304. { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2305. { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2306. { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2307. { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2308. #endif
  2309. { PNormalValue, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2310. { PNormalValue, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2311. { PNormalValue, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
  2312. { PNormalValue, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
  2313. { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  2314. #if 0
  2315. // See Note 1.
  2316. { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2317. #endif
  2318. { PNormalValue, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
  2319. { PNormalValue, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
  2320. { PNormalValue, PLargestValue, "0x1p-128", UnderflowStatus, APFloat::fcNormal },
  2321. { PNormalValue, MLargestValue, "-0x1p-128", UnderflowStatus, APFloat::fcNormal },
  2322. { PNormalValue, PSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity },
  2323. { PNormalValue, MSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
  2324. { PNormalValue, PSmallestNormalized, "0x1p+126", APFloat::opOK, APFloat::fcNormal },
  2325. { PNormalValue, MSmallestNormalized, "-0x1p+126", APFloat::opOK, APFloat::fcNormal },
  2326. { MNormalValue, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2327. { MNormalValue, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2328. { MNormalValue, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
  2329. { MNormalValue, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
  2330. { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  2331. #if 0
  2332. // See Note 1.
  2333. { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2334. #endif
  2335. { MNormalValue, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
  2336. { MNormalValue, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
  2337. { MNormalValue, PLargestValue, "-0x1p-128", UnderflowStatus, APFloat::fcNormal },
  2338. { MNormalValue, MLargestValue, "0x1p-128", UnderflowStatus, APFloat::fcNormal },
  2339. { MNormalValue, PSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
  2340. { MNormalValue, MSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity },
  2341. { MNormalValue, PSmallestNormalized, "-0x1p+126", APFloat::opOK, APFloat::fcNormal },
  2342. { MNormalValue, MSmallestNormalized, "0x1p+126", APFloat::opOK, APFloat::fcNormal },
  2343. { PLargestValue, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2344. { PLargestValue, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2345. { PLargestValue, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
  2346. { PLargestValue, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
  2347. { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  2348. #if 0
  2349. // See Note 1.
  2350. { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2351. #endif
  2352. { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  2353. { PLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  2354. { PLargestValue, PLargestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
  2355. { PLargestValue, MLargestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
  2356. { PLargestValue, PSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity },
  2357. { PLargestValue, MSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
  2358. { PLargestValue, PSmallestNormalized, "inf", OverflowStatus, APFloat::fcInfinity },
  2359. { PLargestValue, MSmallestNormalized, "-inf", OverflowStatus, APFloat::fcInfinity },
  2360. { MLargestValue, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2361. { MLargestValue, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2362. { MLargestValue, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
  2363. { MLargestValue, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
  2364. { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  2365. #if 0
  2366. // See Note 1.
  2367. { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2368. #endif
  2369. { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  2370. { MLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
  2371. { MLargestValue, PLargestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
  2372. { MLargestValue, MLargestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
  2373. { MLargestValue, PSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
  2374. { MLargestValue, MSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity },
  2375. { MLargestValue, PSmallestNormalized, "-inf", OverflowStatus, APFloat::fcInfinity },
  2376. { MLargestValue, MSmallestNormalized, "inf", OverflowStatus, APFloat::fcInfinity },
  2377. { PSmallestValue, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2378. { PSmallestValue, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2379. { PSmallestValue, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
  2380. { PSmallestValue, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
  2381. { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  2382. #if 0
  2383. // See Note 1.
  2384. { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2385. #endif
  2386. { PSmallestValue, PNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
  2387. { PSmallestValue, MNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
  2388. { PSmallestValue, PLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
  2389. { PSmallestValue, MLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
  2390. { PSmallestValue, PSmallestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
  2391. { PSmallestValue, MSmallestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
  2392. { PSmallestValue, PSmallestNormalized, "0x1p-23", APFloat::opOK, APFloat::fcNormal },
  2393. { PSmallestValue, MSmallestNormalized, "-0x1p-23", APFloat::opOK, APFloat::fcNormal },
  2394. { MSmallestValue, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2395. { MSmallestValue, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2396. { MSmallestValue, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
  2397. { MSmallestValue, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
  2398. { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  2399. #if 0
  2400. // See Note 1.
  2401. { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2402. #endif
  2403. { MSmallestValue, PNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
  2404. { MSmallestValue, MNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
  2405. { MSmallestValue, PLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
  2406. { MSmallestValue, MLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
  2407. { MSmallestValue, PSmallestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
  2408. { MSmallestValue, MSmallestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
  2409. { MSmallestValue, PSmallestNormalized, "-0x1p-23", APFloat::opOK, APFloat::fcNormal },
  2410. { MSmallestValue, MSmallestNormalized, "0x1p-23", APFloat::opOK, APFloat::fcNormal },
  2411. { PSmallestNormalized, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2412. { PSmallestNormalized, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2413. { PSmallestNormalized, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
  2414. { PSmallestNormalized, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
  2415. { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  2416. #if 0
  2417. // See Note 1.
  2418. { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2419. #endif
  2420. { PSmallestNormalized, PNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
  2421. { PSmallestNormalized, MNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
  2422. { PSmallestNormalized, PLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
  2423. { PSmallestNormalized, MLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
  2424. { PSmallestNormalized, PSmallestValue, "0x1p+23", APFloat::opOK, APFloat::fcNormal },
  2425. { PSmallestNormalized, MSmallestValue, "-0x1p+23", APFloat::opOK, APFloat::fcNormal },
  2426. { PSmallestNormalized, PSmallestNormalized, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
  2427. { PSmallestNormalized, MSmallestNormalized, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
  2428. { MSmallestNormalized, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
  2429. { MSmallestNormalized, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
  2430. { MSmallestNormalized, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
  2431. { MSmallestNormalized, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
  2432. { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
  2433. #if 0
  2434. // See Note 1.
  2435. { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
  2436. #endif
  2437. { MSmallestNormalized, PNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
  2438. { MSmallestNormalized, MNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
  2439. { MSmallestNormalized, PLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
  2440. { MSmallestNormalized, MLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
  2441. { MSmallestNormalized, PSmallestValue, "-0x1p+23", APFloat::opOK, APFloat::fcNormal },
  2442. { MSmallestNormalized, MSmallestValue, "0x1p+23", APFloat::opOK, APFloat::fcNormal },
  2443. { MSmallestNormalized, PSmallestNormalized, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
  2444. { MSmallestNormalized, MSmallestNormalized, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
  2445. };
  2446. for (size_t i = 0; i < NumTests; ++i) {
  2447. APFloat x(SpecialCaseTests[i].x);
  2448. APFloat y(SpecialCaseTests[i].y);
  2449. APFloat::opStatus status = x.divide(y, APFloat::rmNearestTiesToEven);
  2450. APFloat result(APFloat::IEEEsingle, SpecialCaseTests[i].result);
  2451. EXPECT_TRUE(result.bitwiseIsEqual(x));
  2452. EXPECT_TRUE((int)status == SpecialCaseTests[i].status);
  2453. EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category);
  2454. }
  2455. }
  2456. TEST(APFloatTest, operatorOverloads) {
  2457. // This is mostly testing that these operator overloads compile.
  2458. APFloat One = APFloat(APFloat::IEEEsingle, "0x1p+0");
  2459. APFloat Two = APFloat(APFloat::IEEEsingle, "0x2p+0");
  2460. EXPECT_TRUE(Two.bitwiseIsEqual(One + One));
  2461. EXPECT_TRUE(One.bitwiseIsEqual(Two - One));
  2462. EXPECT_TRUE(Two.bitwiseIsEqual(One * Two));
  2463. EXPECT_TRUE(One.bitwiseIsEqual(Two / Two));
  2464. }
  2465. TEST(APFloatTest, abs) {
  2466. APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false);
  2467. APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true);
  2468. APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false);
  2469. APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true);
  2470. APFloat PQNaN = APFloat::getNaN(APFloat::IEEEsingle, false);
  2471. APFloat MQNaN = APFloat::getNaN(APFloat::IEEEsingle, true);
  2472. APFloat PSNaN = APFloat::getSNaN(APFloat::IEEEsingle, false);
  2473. APFloat MSNaN = APFloat::getSNaN(APFloat::IEEEsingle, true);
  2474. APFloat PNormalValue = APFloat(APFloat::IEEEsingle, "0x1p+0");
  2475. APFloat MNormalValue = APFloat(APFloat::IEEEsingle, "-0x1p+0");
  2476. APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle, false);
  2477. APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle, true);
  2478. APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, false);
  2479. APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, true);
  2480. APFloat PSmallestNormalized =
  2481. APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
  2482. APFloat MSmallestNormalized =
  2483. APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
  2484. EXPECT_TRUE(PInf.bitwiseIsEqual(abs(PInf)));
  2485. EXPECT_TRUE(PInf.bitwiseIsEqual(abs(MInf)));
  2486. EXPECT_TRUE(PZero.bitwiseIsEqual(abs(PZero)));
  2487. EXPECT_TRUE(PZero.bitwiseIsEqual(abs(MZero)));
  2488. EXPECT_TRUE(PQNaN.bitwiseIsEqual(abs(PQNaN)));
  2489. EXPECT_TRUE(PQNaN.bitwiseIsEqual(abs(MQNaN)));
  2490. EXPECT_TRUE(PSNaN.bitwiseIsEqual(abs(PSNaN)));
  2491. EXPECT_TRUE(PSNaN.bitwiseIsEqual(abs(MSNaN)));
  2492. EXPECT_TRUE(PNormalValue.bitwiseIsEqual(abs(PNormalValue)));
  2493. EXPECT_TRUE(PNormalValue.bitwiseIsEqual(abs(MNormalValue)));
  2494. EXPECT_TRUE(PLargestValue.bitwiseIsEqual(abs(PLargestValue)));
  2495. EXPECT_TRUE(PLargestValue.bitwiseIsEqual(abs(MLargestValue)));
  2496. EXPECT_TRUE(PSmallestValue.bitwiseIsEqual(abs(PSmallestValue)));
  2497. EXPECT_TRUE(PSmallestValue.bitwiseIsEqual(abs(MSmallestValue)));
  2498. EXPECT_TRUE(PSmallestNormalized.bitwiseIsEqual(abs(PSmallestNormalized)));
  2499. EXPECT_TRUE(PSmallestNormalized.bitwiseIsEqual(abs(MSmallestNormalized)));
  2500. }
  2501. TEST(APFloatTest, ilogb) {
  2502. EXPECT_EQ(0, ilogb(APFloat(APFloat::IEEEsingle, "0x1p+0")));
  2503. EXPECT_EQ(0, ilogb(APFloat(APFloat::IEEEsingle, "-0x1p+0")));
  2504. EXPECT_EQ(42, ilogb(APFloat(APFloat::IEEEsingle, "0x1p+42")));
  2505. EXPECT_EQ(-42, ilogb(APFloat(APFloat::IEEEsingle, "0x1p-42")));
  2506. EXPECT_EQ(APFloat::IEK_Inf,
  2507. ilogb(APFloat::getInf(APFloat::IEEEsingle, false)));
  2508. EXPECT_EQ(APFloat::IEK_Inf,
  2509. ilogb(APFloat::getInf(APFloat::IEEEsingle, true)));
  2510. EXPECT_EQ(APFloat::IEK_Zero,
  2511. ilogb(APFloat::getZero(APFloat::IEEEsingle, false)));
  2512. EXPECT_EQ(APFloat::IEK_Zero,
  2513. ilogb(APFloat::getZero(APFloat::IEEEsingle, true)));
  2514. EXPECT_EQ(APFloat::IEK_NaN,
  2515. ilogb(APFloat::getNaN(APFloat::IEEEsingle, false)));
  2516. EXPECT_EQ(APFloat::IEK_NaN,
  2517. ilogb(APFloat::getSNaN(APFloat::IEEEsingle, false)));
  2518. EXPECT_EQ(127, ilogb(APFloat::getLargest(APFloat::IEEEsingle, false)));
  2519. EXPECT_EQ(127, ilogb(APFloat::getLargest(APFloat::IEEEsingle, true)));
  2520. EXPECT_EQ(-126, ilogb(APFloat::getSmallest(APFloat::IEEEsingle, false)));
  2521. EXPECT_EQ(-126, ilogb(APFloat::getSmallest(APFloat::IEEEsingle, true)));
  2522. EXPECT_EQ(-126,
  2523. ilogb(APFloat::getSmallestNormalized(APFloat::IEEEsingle, false)));
  2524. EXPECT_EQ(-126,
  2525. ilogb(APFloat::getSmallestNormalized(APFloat::IEEEsingle, true)));
  2526. }
  2527. TEST(APFloatTest, scalbn) {
  2528. EXPECT_TRUE(
  2529. APFloat(APFloat::IEEEsingle, "0x1p+0")
  2530. .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle, "0x1p+0"), 0)));
  2531. EXPECT_TRUE(
  2532. APFloat(APFloat::IEEEsingle, "0x1p+42")
  2533. .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle, "0x1p+0"), 42)));
  2534. EXPECT_TRUE(
  2535. APFloat(APFloat::IEEEsingle, "0x1p-42")
  2536. .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle, "0x1p+0"), -42)));
  2537. APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false);
  2538. APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true);
  2539. APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false);
  2540. APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true);
  2541. APFloat QPNaN = APFloat::getNaN(APFloat::IEEEsingle, false);
  2542. APFloat QMNaN = APFloat::getNaN(APFloat::IEEEsingle, true);
  2543. APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle, false);
  2544. EXPECT_TRUE(PInf.bitwiseIsEqual(scalbn(PInf, 0)));
  2545. EXPECT_TRUE(MInf.bitwiseIsEqual(scalbn(MInf, 0)));
  2546. EXPECT_TRUE(PZero.bitwiseIsEqual(scalbn(PZero, 0)));
  2547. EXPECT_TRUE(MZero.bitwiseIsEqual(scalbn(MZero, 0)));
  2548. EXPECT_TRUE(QPNaN.bitwiseIsEqual(scalbn(QPNaN, 0)));
  2549. EXPECT_TRUE(QMNaN.bitwiseIsEqual(scalbn(QMNaN, 0)));
  2550. EXPECT_TRUE(SNaN.bitwiseIsEqual(scalbn(SNaN, 0)));
  2551. EXPECT_TRUE(
  2552. PInf.bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle, "0x1p+0"), 128)));
  2553. EXPECT_TRUE(MInf.bitwiseIsEqual(
  2554. scalbn(APFloat(APFloat::IEEEsingle, "-0x1p+0"), 128)));
  2555. EXPECT_TRUE(
  2556. PInf.bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle, "0x1p+127"), 1)));
  2557. EXPECT_TRUE(PZero.bitwiseIsEqual(
  2558. scalbn(APFloat(APFloat::IEEEsingle, "0x1p+0"), -127)));
  2559. EXPECT_TRUE(MZero.bitwiseIsEqual(
  2560. scalbn(APFloat(APFloat::IEEEsingle, "-0x1p+0"), -127)));
  2561. EXPECT_TRUE(PZero.bitwiseIsEqual(
  2562. scalbn(APFloat(APFloat::IEEEsingle, "0x1p-126"), -1)));
  2563. EXPECT_TRUE(PZero.bitwiseIsEqual(
  2564. scalbn(APFloat(APFloat::IEEEsingle, "0x1p-126"), -1)));
  2565. }
  2566. }