blob: a86be5af375043fcdcb48a5de5ed5771e85777e8 [file] [log] [blame]
Erick Tryzelaar19f63b22009-08-16 23:36:19 +00001//===- 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
Erick Tryzelaar19f63b22009-08-16 23:36:19 +000010#include "llvm/ADT/APFloat.h"
Jeffrey Yasskin03b81a22011-07-15 07:04:56 +000011#include "llvm/ADT/APSInt.h"
Erick Tryzelaar19f63b22009-08-16 23:36:19 +000012#include "llvm/ADT/SmallString.h"
John McCall29b5c282009-12-24 08:56:26 +000013#include "llvm/ADT/SmallVector.h"
Chandler Carruth130cec22012-12-04 10:23:08 +000014#include "llvm/Support/raw_ostream.h"
15#include "gtest/gtest.h"
16#include <ostream>
17#include <string>
Erick Tryzelaar19f63b22009-08-16 23:36:19 +000018
19using namespace llvm;
20
Daniel Dunbarbc52e4f2009-09-03 22:57:02 +000021static double convertToDoubleFromString(const char *Str) {
22 llvm::APFloat F(0.0);
23 F.convertFromString(Str, llvm::APFloat::rmNearestTiesToEven);
24 return F.convertToDouble();
25}
26
John McCall29b5c282009-12-24 08:56:26 +000027static std::string convertToString(double d, unsigned Prec, unsigned Pad) {
28 llvm::SmallVector<char, 100> Buffer;
29 llvm::APFloat F(d);
30 F.toString(Buffer, Prec, Pad);
31 return std::string(Buffer.data(), Buffer.size());
32}
33
Erick Tryzelaar19f63b22009-08-16 23:36:19 +000034namespace {
35
Michael Gottesman0c622ea2013-05-30 18:07:13 +000036TEST(APFloatTest, isSignaling) {
37 // We test qNaN, -qNaN, +sNaN, -sNaN with and without payloads. *NOTE* The
38 // positive/negative distinction is included only since the getQNaN/getSNaN
39 // API provides the option.
40 APInt payload = APInt::getOneBitSet(4, 2);
41 EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle, false).isSignaling());
42 EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle, true).isSignaling());
43 EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle, false, &payload).isSignaling());
44 EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle, true, &payload).isSignaling());
45 EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle, false).isSignaling());
46 EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle, true).isSignaling());
47 EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle, false, &payload).isSignaling());
48 EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle, true, &payload).isSignaling());
49}
50
51TEST(APFloatTest, next) {
52
53 APFloat test(APFloat::IEEEquad, APFloat::uninitialized);
54 APFloat expected(APFloat::IEEEquad, APFloat::uninitialized);
55
56 // 1. Test Special Cases Values.
57 //
58 // Test all special values for nextUp and nextDown perscribed by IEEE-754R
59 // 2008. These are:
60 // 1. +inf
61 // 2. -inf
62 // 3. getLargest()
63 // 4. -getLargest()
64 // 5. getSmallest()
65 // 6. -getSmallest()
66 // 7. qNaN
67 // 8. sNaN
68 // 9. +0
69 // 10. -0
70
71 // nextUp(+inf) = +inf.
72 test = APFloat::getInf(APFloat::IEEEquad, false);
73 expected = APFloat::getInf(APFloat::IEEEquad, false);
74 EXPECT_EQ(test.next(false), APFloat::opOK);
75 EXPECT_TRUE(test.isInfinity());
76 EXPECT_TRUE(!test.isNegative());
77 EXPECT_TRUE(test.bitwiseIsEqual(expected));
78
79 // nextDown(+inf) = -nextUp(-inf) = -(-getLargest()) = getLargest()
80 test = APFloat::getInf(APFloat::IEEEquad, false);
81 expected = APFloat::getLargest(APFloat::IEEEquad, false);
82 EXPECT_EQ(test.next(true), APFloat::opOK);
83 EXPECT_TRUE(!test.isNegative());
84 EXPECT_TRUE(test.bitwiseIsEqual(expected));
85
86 // nextUp(-inf) = -getLargest()
87 test = APFloat::getInf(APFloat::IEEEquad, true);
88 expected = APFloat::getLargest(APFloat::IEEEquad, true);
89 EXPECT_EQ(test.next(false), APFloat::opOK);
90 EXPECT_TRUE(test.isNegative());
91 EXPECT_TRUE(test.bitwiseIsEqual(expected));
92
93 // nextDown(-inf) = -nextUp(+inf) = -(+inf) = -inf.
94 test = APFloat::getInf(APFloat::IEEEquad, true);
95 expected = APFloat::getInf(APFloat::IEEEquad, true);
96 EXPECT_EQ(test.next(true), APFloat::opOK);
97 EXPECT_TRUE(test.isInfinity() && test.isNegative());
98 EXPECT_TRUE(test.bitwiseIsEqual(expected));
99
100 // nextUp(getLargest()) = +inf
101 test = APFloat::getLargest(APFloat::IEEEquad, false);
102 expected = APFloat::getInf(APFloat::IEEEquad, false);
103 EXPECT_EQ(test.next(false), APFloat::opOK);
104 EXPECT_TRUE(test.isInfinity() && !test.isNegative());
105 EXPECT_TRUE(test.bitwiseIsEqual(expected));
106
107 // nextDown(getLargest()) = -nextUp(-getLargest())
108 // = -(-getLargest() + inc)
109 // = getLargest() - inc.
110 test = APFloat::getLargest(APFloat::IEEEquad, false);
111 expected = APFloat(APFloat::IEEEquad,
112 "0x1.fffffffffffffffffffffffffffep+16383");
113 EXPECT_EQ(test.next(true), APFloat::opOK);
114 EXPECT_TRUE(!test.isInfinity() && !test.isNegative());
115 EXPECT_TRUE(test.bitwiseIsEqual(expected));
116
117 // nextUp(-getLargest()) = -getLargest() + inc.
118 test = APFloat::getLargest(APFloat::IEEEquad, true);
119 expected = APFloat(APFloat::IEEEquad,
120 "-0x1.fffffffffffffffffffffffffffep+16383");
121 EXPECT_EQ(test.next(false), APFloat::opOK);
122 EXPECT_TRUE(test.bitwiseIsEqual(expected));
123
124 // nextDown(-getLargest()) = -nextUp(getLargest()) = -(inf) = -inf.
125 test = APFloat::getLargest(APFloat::IEEEquad, true);
126 expected = APFloat::getInf(APFloat::IEEEquad, true);
127 EXPECT_EQ(test.next(true), APFloat::opOK);
128 EXPECT_TRUE(test.isInfinity() && test.isNegative());
129 EXPECT_TRUE(test.bitwiseIsEqual(expected));
130
131 // nextUp(getSmallest()) = getSmallest() + inc.
132 test = APFloat(APFloat::IEEEquad, "0x0.0000000000000000000000000001p-16382");
133 expected = APFloat(APFloat::IEEEquad,
134 "0x0.0000000000000000000000000002p-16382");
135 EXPECT_EQ(test.next(false), APFloat::opOK);
136 EXPECT_TRUE(test.bitwiseIsEqual(expected));
137
138 // nextDown(getSmallest()) = -nextUp(-getSmallest()) = -(-0) = +0.
139 test = APFloat(APFloat::IEEEquad, "0x0.0000000000000000000000000001p-16382");
140 expected = APFloat::getZero(APFloat::IEEEquad, false);
141 EXPECT_EQ(test.next(true), APFloat::opOK);
142 EXPECT_TRUE(test.isZero() && !test.isNegative());
143 EXPECT_TRUE(test.bitwiseIsEqual(expected));
144
145 // nextUp(-getSmallest()) = -0.
146 test = APFloat(APFloat::IEEEquad, "-0x0.0000000000000000000000000001p-16382");
147 expected = APFloat::getZero(APFloat::IEEEquad, true);
148 EXPECT_EQ(test.next(false), APFloat::opOK);
149 EXPECT_TRUE(test.isZero() && test.isNegative());
150 EXPECT_TRUE(test.bitwiseIsEqual(expected));
151
152 // nextDown(-getSmallest()) = -nextUp(getSmallest()) = -getSmallest() - inc.
153 test = APFloat(APFloat::IEEEquad, "-0x0.0000000000000000000000000001p-16382");
154 expected = APFloat(APFloat::IEEEquad,
155 "-0x0.0000000000000000000000000002p-16382");
156 EXPECT_EQ(test.next(true), APFloat::opOK);
157 EXPECT_TRUE(test.bitwiseIsEqual(expected));
158
159 // nextUp(qNaN) = qNaN
160 test = APFloat::getQNaN(APFloat::IEEEquad, false);
161 expected = APFloat::getQNaN(APFloat::IEEEquad, false);
162 EXPECT_EQ(test.next(false), APFloat::opOK);
163 EXPECT_TRUE(test.bitwiseIsEqual(expected));
164
165 // nextDown(qNaN) = qNaN
166 test = APFloat::getQNaN(APFloat::IEEEquad, false);
167 expected = APFloat::getQNaN(APFloat::IEEEquad, false);
168 EXPECT_EQ(test.next(true), APFloat::opOK);
169 EXPECT_TRUE(test.bitwiseIsEqual(expected));
170
171 // nextUp(sNaN) = qNaN
172 test = APFloat::getSNaN(APFloat::IEEEquad, false);
173 expected = APFloat::getQNaN(APFloat::IEEEquad, false);
174 EXPECT_EQ(test.next(false), APFloat::opInvalidOp);
175 EXPECT_TRUE(test.bitwiseIsEqual(expected));
176
177 // nextDown(sNaN) = qNaN
178 test = APFloat::getSNaN(APFloat::IEEEquad, false);
179 expected = APFloat::getQNaN(APFloat::IEEEquad, false);
180 EXPECT_EQ(test.next(true), APFloat::opInvalidOp);
181 EXPECT_TRUE(test.bitwiseIsEqual(expected));
182
183 // nextUp(+0) = +getSmallest()
184 test = APFloat::getZero(APFloat::IEEEquad, false);
185 expected = APFloat::getSmallest(APFloat::IEEEquad, false);
186 EXPECT_EQ(test.next(false), APFloat::opOK);
187 EXPECT_TRUE(test.bitwiseIsEqual(expected));
188
189 // nextDown(+0) = -nextUp(-0) = -getSmallest()
190 test = APFloat::getZero(APFloat::IEEEquad, false);
191 expected = APFloat::getSmallest(APFloat::IEEEquad, true);
192 EXPECT_EQ(test.next(true), APFloat::opOK);
193 EXPECT_TRUE(test.bitwiseIsEqual(expected));
194
195 // nextUp(-0) = +getSmallest()
196 test = APFloat::getZero(APFloat::IEEEquad, true);
197 expected = APFloat::getSmallest(APFloat::IEEEquad, false);
198 EXPECT_EQ(test.next(false), APFloat::opOK);
199 EXPECT_TRUE(test.bitwiseIsEqual(expected));
200
201 // nextDown(-0) = -nextUp(0) = -getSmallest()
202 test = APFloat::getZero(APFloat::IEEEquad, true);
203 expected = APFloat::getSmallest(APFloat::IEEEquad, true);
204 EXPECT_EQ(test.next(true), APFloat::opOK);
205 EXPECT_TRUE(test.bitwiseIsEqual(expected));
206
207 // 2. Binade Boundary Tests.
208
209 // 2a. Test denormal <-> normal binade boundaries.
210 // * nextUp(+Largest Denormal) -> +Smallest Normal.
211 // * nextDown(-Largest Denormal) -> -Smallest Normal.
212 // * nextUp(-Smallest Normal) -> -Largest Denormal.
213 // * nextDown(+Smallest Normal) -> +Largest Denormal.
214
215 // nextUp(+Largest Denormal) -> +Smallest Normal.
216 test = APFloat(APFloat::IEEEquad, "0x0.ffffffffffffffffffffffffffffp-16382");
217 expected = APFloat(APFloat::IEEEquad,
218 "0x1.0000000000000000000000000000p-16382");
219 EXPECT_EQ(test.next(false), APFloat::opOK);
220 EXPECT_FALSE(test.isDenormal());
221 EXPECT_TRUE(test.bitwiseIsEqual(expected));
222
223 // nextDown(-Largest Denormal) -> -Smallest Normal.
224 test = APFloat(APFloat::IEEEquad,
225 "-0x0.ffffffffffffffffffffffffffffp-16382");
226 expected = APFloat(APFloat::IEEEquad,
227 "-0x1.0000000000000000000000000000p-16382");
228 EXPECT_EQ(test.next(true), APFloat::opOK);
229 EXPECT_FALSE(test.isDenormal());
230 EXPECT_TRUE(test.bitwiseIsEqual(expected));
231
232 // nextUp(-Smallest Normal) -> -LargestDenormal.
233 test = APFloat(APFloat::IEEEquad,
234 "-0x1.0000000000000000000000000000p-16382");
235 expected = APFloat(APFloat::IEEEquad,
236 "-0x0.ffffffffffffffffffffffffffffp-16382");
237 EXPECT_EQ(test.next(false), APFloat::opOK);
238 EXPECT_TRUE(test.isDenormal());
239 EXPECT_TRUE(test.bitwiseIsEqual(expected));
240
241 // nextDown(+Smallest Normal) -> +Largest Denormal.
242 test = APFloat(APFloat::IEEEquad,
243 "+0x1.0000000000000000000000000000p-16382");
244 expected = APFloat(APFloat::IEEEquad,
245 "+0x0.ffffffffffffffffffffffffffffp-16382");
246 EXPECT_EQ(test.next(true), APFloat::opOK);
247 EXPECT_TRUE(test.isDenormal());
248 EXPECT_TRUE(test.bitwiseIsEqual(expected));
249
250 // 2b. Test normal <-> normal binade boundaries.
251 // * nextUp(-Normal Binade Boundary) -> -Normal Binade Boundary + 1.
252 // * nextDown(+Normal Binade Boundary) -> +Normal Binade Boundary - 1.
253 // * nextUp(+Normal Binade Boundary - 1) -> +Normal Binade Boundary.
254 // * nextDown(-Normal Binade Boundary + 1) -> -Normal Binade Boundary.
255
256 // nextUp(-Normal Binade Boundary) -> -Normal Binade Boundary + 1.
257 test = APFloat(APFloat::IEEEquad, "-0x1p+1");
258 expected = APFloat(APFloat::IEEEquad,
259 "-0x1.ffffffffffffffffffffffffffffp+0");
260 EXPECT_EQ(test.next(false), APFloat::opOK);
261 EXPECT_TRUE(test.bitwiseIsEqual(expected));
262
263 // nextDown(+Normal Binade Boundary) -> +Normal Binade Boundary - 1.
264 test = APFloat(APFloat::IEEEquad, "0x1p+1");
265 expected = APFloat(APFloat::IEEEquad, "0x1.ffffffffffffffffffffffffffffp+0");
266 EXPECT_EQ(test.next(true), APFloat::opOK);
267 EXPECT_TRUE(test.bitwiseIsEqual(expected));
268
269 // nextUp(+Normal Binade Boundary - 1) -> +Normal Binade Boundary.
270 test = APFloat(APFloat::IEEEquad, "0x1.ffffffffffffffffffffffffffffp+0");
271 expected = APFloat(APFloat::IEEEquad, "0x1p+1");
272 EXPECT_EQ(test.next(false), APFloat::opOK);
273 EXPECT_TRUE(test.bitwiseIsEqual(expected));
274
275 // nextDown(-Normal Binade Boundary + 1) -> -Normal Binade Boundary.
276 test = APFloat(APFloat::IEEEquad, "-0x1.ffffffffffffffffffffffffffffp+0");
277 expected = APFloat(APFloat::IEEEquad, "-0x1p+1");
278 EXPECT_EQ(test.next(true), APFloat::opOK);
279 EXPECT_TRUE(test.bitwiseIsEqual(expected));
280
281 // 2c. Test using next at binade boundaries with a direction away from the
282 // binade boundary. Away from denormal <-> normal boundaries.
283 //
284 // This is to make sure that even though we are at a binade boundary, since
285 // we are rounding away, we do not trigger the binade boundary code. Thus we
286 // test:
287 // * nextUp(-Largest Denormal) -> -Largest Denormal + inc.
288 // * nextDown(+Largest Denormal) -> +Largest Denormal - inc.
289 // * nextUp(+Smallest Normal) -> +Smallest Normal + inc.
290 // * nextDown(-Smallest Normal) -> -Smallest Normal - inc.
291
292 // nextUp(-Largest Denormal) -> -Largest Denormal + inc.
293 test = APFloat(APFloat::IEEEquad, "-0x0.ffffffffffffffffffffffffffffp-16382");
294 expected = APFloat(APFloat::IEEEquad,
295 "-0x0.fffffffffffffffffffffffffffep-16382");
296 EXPECT_EQ(test.next(false), APFloat::opOK);
297 EXPECT_TRUE(test.isDenormal());
298 EXPECT_TRUE(test.isNegative());
299 EXPECT_TRUE(test.bitwiseIsEqual(expected));
300
301 // nextDown(+Largest Denormal) -> +Largest Denormal - inc.
302 test = APFloat(APFloat::IEEEquad, "0x0.ffffffffffffffffffffffffffffp-16382");
303 expected = APFloat(APFloat::IEEEquad,
304 "0x0.fffffffffffffffffffffffffffep-16382");
305 EXPECT_EQ(test.next(true), APFloat::opOK);
306 EXPECT_TRUE(test.isDenormal());
307 EXPECT_TRUE(!test.isNegative());
308 EXPECT_TRUE(test.bitwiseIsEqual(expected));
309
310 // nextUp(+Smallest Normal) -> +Smallest Normal + inc.
311 test = APFloat(APFloat::IEEEquad, "0x1.0000000000000000000000000000p-16382");
312 expected = APFloat(APFloat::IEEEquad,
313 "0x1.0000000000000000000000000001p-16382");
314 EXPECT_EQ(test.next(false), APFloat::opOK);
315 EXPECT_TRUE(!test.isDenormal());
316 EXPECT_TRUE(!test.isNegative());
317 EXPECT_TRUE(test.bitwiseIsEqual(expected));
318
319 // nextDown(-Smallest Normal) -> -Smallest Normal - inc.
320 test = APFloat(APFloat::IEEEquad, "-0x1.0000000000000000000000000000p-16382");
321 expected = APFloat(APFloat::IEEEquad,
322 "-0x1.0000000000000000000000000001p-16382");
323 EXPECT_EQ(test.next(true), APFloat::opOK);
324 EXPECT_TRUE(!test.isDenormal());
325 EXPECT_TRUE(test.isNegative());
326 EXPECT_TRUE(test.bitwiseIsEqual(expected));
327
328 // 2d. Test values which cause our exponent to go to min exponent. This
329 // is to ensure that guards in the code to check for min exponent
330 // trigger properly.
331 // * nextUp(-0x1p-16381) -> -0x1.ffffffffffffffffffffffffffffp-16382
332 // * nextDown(-0x1.ffffffffffffffffffffffffffffp-16382) ->
333 // -0x1p-16381
334 // * nextUp(0x1.ffffffffffffffffffffffffffffp-16382) -> 0x1p-16382
335 // * nextDown(0x1p-16382) -> 0x1.ffffffffffffffffffffffffffffp-16382
336
337 // nextUp(-0x1p-16381) -> -0x1.ffffffffffffffffffffffffffffp-16382
338 test = APFloat(APFloat::IEEEquad, "-0x1p-16381");
339 expected = APFloat(APFloat::IEEEquad,
340 "-0x1.ffffffffffffffffffffffffffffp-16382");
341 EXPECT_EQ(test.next(false), APFloat::opOK);
342 EXPECT_TRUE(test.bitwiseIsEqual(expected));
343
344 // nextDown(-0x1.ffffffffffffffffffffffffffffp-16382) ->
345 // -0x1p-16381
346 test = APFloat(APFloat::IEEEquad, "-0x1.ffffffffffffffffffffffffffffp-16382");
347 expected = APFloat(APFloat::IEEEquad, "-0x1p-16381");
348 EXPECT_EQ(test.next(true), APFloat::opOK);
349 EXPECT_TRUE(test.bitwiseIsEqual(expected));
350
351 // nextUp(0x1.ffffffffffffffffffffffffffffp-16382) -> 0x1p-16381
352 test = APFloat(APFloat::IEEEquad, "0x1.ffffffffffffffffffffffffffffp-16382");
353 expected = APFloat(APFloat::IEEEquad, "0x1p-16381");
354 EXPECT_EQ(test.next(false), APFloat::opOK);
355 EXPECT_TRUE(test.bitwiseIsEqual(expected));
356
357 // nextDown(0x1p-16381) -> 0x1.ffffffffffffffffffffffffffffp-16382
358 test = APFloat(APFloat::IEEEquad, "0x1p-16381");
359 expected = APFloat(APFloat::IEEEquad,
360 "0x1.ffffffffffffffffffffffffffffp-16382");
361 EXPECT_EQ(test.next(true), APFloat::opOK);
362 EXPECT_TRUE(test.bitwiseIsEqual(expected));
363
364 // 3. Now we test both denormal/normal computation which will not cause us
365 // to go across binade boundaries. Specifically we test:
366 // * nextUp(+Denormal) -> +Denormal.
367 // * nextDown(+Denormal) -> +Denormal.
368 // * nextUp(-Denormal) -> -Denormal.
369 // * nextDown(-Denormal) -> -Denormal.
370 // * nextUp(+Normal) -> +Normal.
371 // * nextDown(+Normal) -> +Normal.
372 // * nextUp(-Normal) -> -Normal.
373 // * nextDown(-Normal) -> -Normal.
374
375 // nextUp(+Denormal) -> +Denormal.
376 test = APFloat(APFloat::IEEEquad,
377 "0x0.ffffffffffffffffffffffff000cp-16382");
378 expected = APFloat(APFloat::IEEEquad,
379 "0x0.ffffffffffffffffffffffff000dp-16382");
380 EXPECT_EQ(test.next(false), APFloat::opOK);
381 EXPECT_TRUE(test.isDenormal());
382 EXPECT_TRUE(!test.isNegative());
383 EXPECT_TRUE(test.bitwiseIsEqual(expected));
384
385 // nextDown(+Denormal) -> +Denormal.
386 test = APFloat(APFloat::IEEEquad,
387 "0x0.ffffffffffffffffffffffff000cp-16382");
388 expected = APFloat(APFloat::IEEEquad,
389 "0x0.ffffffffffffffffffffffff000bp-16382");
390 EXPECT_EQ(test.next(true), APFloat::opOK);
391 EXPECT_TRUE(test.isDenormal());
392 EXPECT_TRUE(!test.isNegative());
393 EXPECT_TRUE(test.bitwiseIsEqual(expected));
394
395 // nextUp(-Denormal) -> -Denormal.
396 test = APFloat(APFloat::IEEEquad,
397 "-0x0.ffffffffffffffffffffffff000cp-16382");
398 expected = APFloat(APFloat::IEEEquad,
399 "-0x0.ffffffffffffffffffffffff000bp-16382");
400 EXPECT_EQ(test.next(false), APFloat::opOK);
401 EXPECT_TRUE(test.isDenormal());
402 EXPECT_TRUE(test.isNegative());
403 EXPECT_TRUE(test.bitwiseIsEqual(expected));
404
405 // nextDown(-Denormal) -> -Denormal
406 test = APFloat(APFloat::IEEEquad,
407 "-0x0.ffffffffffffffffffffffff000cp-16382");
408 expected = APFloat(APFloat::IEEEquad,
409 "-0x0.ffffffffffffffffffffffff000dp-16382");
410 EXPECT_EQ(test.next(true), APFloat::opOK);
411 EXPECT_TRUE(test.isDenormal());
412 EXPECT_TRUE(test.isNegative());
413 EXPECT_TRUE(test.bitwiseIsEqual(expected));
414
415 // nextUp(+Normal) -> +Normal.
416 test = APFloat(APFloat::IEEEquad,
417 "0x1.ffffffffffffffffffffffff000cp-16000");
418 expected = APFloat(APFloat::IEEEquad,
419 "0x1.ffffffffffffffffffffffff000dp-16000");
420 EXPECT_EQ(test.next(false), APFloat::opOK);
421 EXPECT_TRUE(!test.isDenormal());
422 EXPECT_TRUE(!test.isNegative());
423 EXPECT_TRUE(test.bitwiseIsEqual(expected));
424
425 // nextDown(+Normal) -> +Normal.
426 test = APFloat(APFloat::IEEEquad,
427 "0x1.ffffffffffffffffffffffff000cp-16000");
428 expected = APFloat(APFloat::IEEEquad,
429 "0x1.ffffffffffffffffffffffff000bp-16000");
430 EXPECT_EQ(test.next(true), APFloat::opOK);
431 EXPECT_TRUE(!test.isDenormal());
432 EXPECT_TRUE(!test.isNegative());
433 EXPECT_TRUE(test.bitwiseIsEqual(expected));
434
435 // nextUp(-Normal) -> -Normal.
436 test = APFloat(APFloat::IEEEquad,
437 "-0x1.ffffffffffffffffffffffff000cp-16000");
438 expected = APFloat(APFloat::IEEEquad,
439 "-0x1.ffffffffffffffffffffffff000bp-16000");
440 EXPECT_EQ(test.next(false), APFloat::opOK);
441 EXPECT_TRUE(!test.isDenormal());
442 EXPECT_TRUE(test.isNegative());
443 EXPECT_TRUE(test.bitwiseIsEqual(expected));
444
445 // nextDown(-Normal) -> -Normal.
446 test = APFloat(APFloat::IEEEquad,
447 "-0x1.ffffffffffffffffffffffff000cp-16000");
448 expected = APFloat(APFloat::IEEEquad,
449 "-0x1.ffffffffffffffffffffffff000dp-16000");
450 EXPECT_EQ(test.next(true), APFloat::opOK);
451 EXPECT_TRUE(!test.isDenormal());
452 EXPECT_TRUE(test.isNegative());
453 EXPECT_TRUE(test.bitwiseIsEqual(expected));
454}
455
Shuxin Yangbbddbac2013-05-13 18:03:12 +0000456TEST(APFloatTest, FMA) {
457 APFloat::roundingMode rdmd = APFloat::rmNearestTiesToEven;
458
459 {
460 APFloat f1(14.5f);
461 APFloat f2(-14.5f);
462 APFloat f3(225.0f);
463 f1.fusedMultiplyAdd(f2, f3, APFloat::rmNearestTiesToEven);
464 EXPECT_EQ(14.75f, f1.convertToFloat());
465 }
466
467 {
468 APFloat Val2(2.0f);
469 APFloat f1((float)1.17549435e-38F);
470 APFloat f2((float)1.17549435e-38F);
471 f1.divide(Val2, rdmd);
472 f2.divide(Val2, rdmd);
473 APFloat f3(12.0f);
474 f1.fusedMultiplyAdd(f2, f3, APFloat::rmNearestTiesToEven);
475 EXPECT_EQ(12.0f, f1.convertToFloat());
476 }
477}
478
Matt Arsenault5ccdb982014-10-10 05:21:32 +0000479TEST(APFloatTest, MinNum) {
480 APFloat f1(1.0);
481 APFloat f2(2.0);
482 APFloat nan = APFloat::getNaN(APFloat::IEEEdouble);
483
484 EXPECT_EQ(1.0, minnum(f1, f2).convertToDouble());
485 EXPECT_EQ(1.0, minnum(f2, f1).convertToDouble());
486 EXPECT_EQ(1.0, minnum(f1, nan).convertToDouble());
487 EXPECT_EQ(1.0, minnum(nan, f1).convertToDouble());
488}
489
490TEST(APFloatTest, MaxNum) {
491 APFloat f1(1.0);
492 APFloat f2(2.0);
493 APFloat nan = APFloat::getNaN(APFloat::IEEEdouble);
494
495 EXPECT_EQ(2.0, maxnum(f1, f2).convertToDouble());
496 EXPECT_EQ(2.0, maxnum(f2, f1).convertToDouble());
497 EXPECT_EQ(1.0, maxnum(f1, nan).convertToDouble());
498 EXPECT_EQ(1.0, minnum(nan, f1).convertToDouble());
499}
500
Shuxin Yang4fb504f2013-01-07 18:59:35 +0000501TEST(APFloatTest, Denormal) {
502 APFloat::roundingMode rdmd = APFloat::rmNearestTiesToEven;
503
504 // Test single precision
505 {
506 const char *MinNormalStr = "1.17549435082228750797e-38";
507 EXPECT_FALSE(APFloat(APFloat::IEEEsingle, MinNormalStr).isDenormal());
508 EXPECT_FALSE(APFloat(APFloat::IEEEsingle, 0.0).isDenormal());
509
510 APFloat Val2(APFloat::IEEEsingle, 2.0e0);
511 APFloat T(APFloat::IEEEsingle, MinNormalStr);
512 T.divide(Val2, rdmd);
513 EXPECT_TRUE(T.isDenormal());
514 }
515
516 // Test double precision
517 {
518 const char *MinNormalStr = "2.22507385850720138309e-308";
519 EXPECT_FALSE(APFloat(APFloat::IEEEdouble, MinNormalStr).isDenormal());
520 EXPECT_FALSE(APFloat(APFloat::IEEEdouble, 0.0).isDenormal());
521
522 APFloat Val2(APFloat::IEEEdouble, 2.0e0);
523 APFloat T(APFloat::IEEEdouble, MinNormalStr);
524 T.divide(Val2, rdmd);
525 EXPECT_TRUE(T.isDenormal());
526 }
527
528 // Test Intel double-ext
529 {
530 const char *MinNormalStr = "3.36210314311209350626e-4932";
531 EXPECT_FALSE(APFloat(APFloat::x87DoubleExtended, MinNormalStr).isDenormal());
532 EXPECT_FALSE(APFloat(APFloat::x87DoubleExtended, 0.0).isDenormal());
533
534 APFloat Val2(APFloat::x87DoubleExtended, 2.0e0);
535 APFloat T(APFloat::x87DoubleExtended, MinNormalStr);
536 T.divide(Val2, rdmd);
537 EXPECT_TRUE(T.isDenormal());
538 }
539
540 // Test quadruple precision
541 {
542 const char *MinNormalStr = "3.36210314311209350626267781732175260e-4932";
543 EXPECT_FALSE(APFloat(APFloat::IEEEquad, MinNormalStr).isDenormal());
544 EXPECT_FALSE(APFloat(APFloat::IEEEquad, 0.0).isDenormal());
545
546 APFloat Val2(APFloat::IEEEquad, 2.0e0);
547 APFloat T(APFloat::IEEEquad, MinNormalStr);
548 T.divide(Val2, rdmd);
549 EXPECT_TRUE(T.isDenormal());
550 }
551}
552
Erick Tryzelaar19f63b22009-08-16 23:36:19 +0000553TEST(APFloatTest, Zero) {
Matt Beaumont-Gaya421ee12011-08-29 17:54:20 +0000554 EXPECT_EQ(0.0f, APFloat(0.0f).convertToFloat());
555 EXPECT_EQ(-0.0f, APFloat(-0.0f).convertToFloat());
556 EXPECT_TRUE(APFloat(-0.0f).isNegative());
Erick Tryzelaar19f63b22009-08-16 23:36:19 +0000557
Matt Beaumont-Gaya421ee12011-08-29 17:54:20 +0000558 EXPECT_EQ(0.0, APFloat(0.0).convertToDouble());
559 EXPECT_EQ(-0.0, APFloat(-0.0).convertToDouble());
560 EXPECT_TRUE(APFloat(-0.0).isNegative());
Erick Tryzelaar19f63b22009-08-16 23:36:19 +0000561}
562
Michael Gottesman228156c2013-07-01 23:54:08 +0000563TEST(APFloatTest, DecimalStringsWithoutNullTerminators) {
564 // Make sure that we can parse strings without null terminators.
565 // rdar://14323230.
566 APFloat Val(APFloat::IEEEdouble);
567 Val.convertFromString(StringRef("0.00", 3),
568 llvm::APFloat::rmNearestTiesToEven);
569 EXPECT_EQ(Val.convertToDouble(), 0.0);
570 Val.convertFromString(StringRef("0.01", 3),
571 llvm::APFloat::rmNearestTiesToEven);
572 EXPECT_EQ(Val.convertToDouble(), 0.0);
573 Val.convertFromString(StringRef("0.09", 3),
574 llvm::APFloat::rmNearestTiesToEven);
575 EXPECT_EQ(Val.convertToDouble(), 0.0);
576 Val.convertFromString(StringRef("0.095", 4),
577 llvm::APFloat::rmNearestTiesToEven);
578 EXPECT_EQ(Val.convertToDouble(), 0.09);
579 Val.convertFromString(StringRef("0.00e+3", 7),
580 llvm::APFloat::rmNearestTiesToEven);
581 EXPECT_EQ(Val.convertToDouble(), 0.00);
582 Val.convertFromString(StringRef("0e+3", 4),
583 llvm::APFloat::rmNearestTiesToEven);
584 EXPECT_EQ(Val.convertToDouble(), 0.00);
585
586}
587
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000588TEST(APFloatTest, fromZeroDecimalString) {
589 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0").convertToDouble());
590 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0").convertToDouble());
Erick Tryzelaarbc0d7492009-08-17 00:14:11 +0000591 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0").convertToDouble());
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000592
593 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.").convertToDouble());
594 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.").convertToDouble());
Erick Tryzelaarbc0d7492009-08-17 00:14:11 +0000595 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.").convertToDouble());
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000596
597 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, ".0").convertToDouble());
598 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+.0").convertToDouble());
Erick Tryzelaarbc0d7492009-08-17 00:14:11 +0000599 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-.0").convertToDouble());
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000600
601 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.0").convertToDouble());
602 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.0").convertToDouble());
Erick Tryzelaarbc0d7492009-08-17 00:14:11 +0000603 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.0").convertToDouble());
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000604
605 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "00000.").convertToDouble());
606 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+00000.").convertToDouble());
607 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-00000.").convertToDouble());
608
Erick Tryzelaarbc0d7492009-08-17 00:14:11 +0000609 EXPECT_EQ(0.0, APFloat(APFloat::IEEEdouble, ".00000").convertToDouble());
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000610 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+.00000").convertToDouble());
611 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-.00000").convertToDouble());
612
613 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0000.00000").convertToDouble());
614 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0000.00000").convertToDouble());
615 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0000.00000").convertToDouble());
616}
617
618TEST(APFloatTest, fromZeroDecimalSingleExponentString) {
619 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0e1").convertToDouble());
620 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e1").convertToDouble());
621 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e1").convertToDouble());
622
623 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0e+1").convertToDouble());
624 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e+1").convertToDouble());
625 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e+1").convertToDouble());
626
627 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0e-1").convertToDouble());
628 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e-1").convertToDouble());
629 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e-1").convertToDouble());
630
631
632 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.e1").convertToDouble());
633 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.e1").convertToDouble());
634 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.e1").convertToDouble());
635
636 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.e+1").convertToDouble());
637 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.e+1").convertToDouble());
638 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.e+1").convertToDouble());
639
640 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.e-1").convertToDouble());
641 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.e-1").convertToDouble());
642 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.e-1").convertToDouble());
643
644 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, ".0e1").convertToDouble());
645 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+.0e1").convertToDouble());
646 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-.0e1").convertToDouble());
647
648 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, ".0e+1").convertToDouble());
649 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+.0e+1").convertToDouble());
650 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-.0e+1").convertToDouble());
651
652 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, ".0e-1").convertToDouble());
653 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+.0e-1").convertToDouble());
654 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-.0e-1").convertToDouble());
655
656
657 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.0e1").convertToDouble());
658 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.0e1").convertToDouble());
659 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.0e1").convertToDouble());
660
661 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.0e+1").convertToDouble());
662 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.0e+1").convertToDouble());
663 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.0e+1").convertToDouble());
664
665 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.0e-1").convertToDouble());
666 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.0e-1").convertToDouble());
667 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.0e-1").convertToDouble());
668
669
670 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "000.0000e1").convertToDouble());
671 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+000.0000e+1").convertToDouble());
672 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-000.0000e+1").convertToDouble());
673}
674
675TEST(APFloatTest, fromZeroDecimalLargeExponentString) {
676 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0e1234").convertToDouble());
677 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e1234").convertToDouble());
678 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e1234").convertToDouble());
679
680 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0e+1234").convertToDouble());
681 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e+1234").convertToDouble());
682 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e+1234").convertToDouble());
683
684 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0e-1234").convertToDouble());
685 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e-1234").convertToDouble());
686 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e-1234").convertToDouble());
687
Erick Tryzelaarbc0d7492009-08-17 00:14:11 +0000688 EXPECT_EQ(0.0, APFloat(APFloat::IEEEdouble, "000.0000e1234").convertToDouble());
689 EXPECT_EQ(0.0, APFloat(APFloat::IEEEdouble, "000.0000e-1234").convertToDouble());
Erick Tryzelaar19f63b22009-08-16 23:36:19 +0000690
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000691 EXPECT_EQ(0.0, APFloat(APFloat::IEEEdouble, StringRef("0e1234\02", 6)).convertToDouble());
692}
Erick Tryzelaar19f63b22009-08-16 23:36:19 +0000693
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000694TEST(APFloatTest, fromZeroHexadecimalString) {
695 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0p1").convertToDouble());
696 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0p1").convertToDouble());
697 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0p1").convertToDouble());
698
699 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0p+1").convertToDouble());
700 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0p+1").convertToDouble());
701 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0p+1").convertToDouble());
702
703 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0p-1").convertToDouble());
704 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0p-1").convertToDouble());
705 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0p-1").convertToDouble());
706
707
708 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.p1").convertToDouble());
709 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.p1").convertToDouble());
710 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.p1").convertToDouble());
711
712 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.p+1").convertToDouble());
713 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.p+1").convertToDouble());
714 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.p+1").convertToDouble());
715
716 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.p-1").convertToDouble());
717 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.p-1").convertToDouble());
718 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.p-1").convertToDouble());
719
720
721 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x.0p1").convertToDouble());
722 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x.0p1").convertToDouble());
723 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x.0p1").convertToDouble());
724
725 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x.0p+1").convertToDouble());
726 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x.0p+1").convertToDouble());
727 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x.0p+1").convertToDouble());
728
729 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x.0p-1").convertToDouble());
730 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x.0p-1").convertToDouble());
731 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x.0p-1").convertToDouble());
732
733
734 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.0p1").convertToDouble());
735 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.0p1").convertToDouble());
736 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.0p1").convertToDouble());
737
738 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.0p+1").convertToDouble());
739 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.0p+1").convertToDouble());
740 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.0p+1").convertToDouble());
741
742 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.0p-1").convertToDouble());
743 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.0p-1").convertToDouble());
744 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.0p-1").convertToDouble());
745
746
747 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x00000.p1").convertToDouble());
748 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0000.00000p1").convertToDouble());
749 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x.00000p1").convertToDouble());
750 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.p1").convertToDouble());
751 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0p1234").convertToDouble());
752 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0p1234").convertToDouble());
753 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x00000.p1234").convertToDouble());
754 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0000.00000p1234").convertToDouble());
755 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x.00000p1234").convertToDouble());
756 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.p1234").convertToDouble());
757}
758
759TEST(APFloatTest, fromDecimalString) {
760 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble, "1").convertToDouble());
761 EXPECT_EQ(2.0, APFloat(APFloat::IEEEdouble, "2.").convertToDouble());
762 EXPECT_EQ(0.5, APFloat(APFloat::IEEEdouble, ".5").convertToDouble());
763 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble, "1.0").convertToDouble());
764 EXPECT_EQ(-2.0, APFloat(APFloat::IEEEdouble, "-2").convertToDouble());
765 EXPECT_EQ(-4.0, APFloat(APFloat::IEEEdouble, "-4.").convertToDouble());
766 EXPECT_EQ(-0.5, APFloat(APFloat::IEEEdouble, "-.5").convertToDouble());
767 EXPECT_EQ(-1.5, APFloat(APFloat::IEEEdouble, "-1.5").convertToDouble());
768 EXPECT_EQ(1.25e12, APFloat(APFloat::IEEEdouble, "1.25e12").convertToDouble());
769 EXPECT_EQ(1.25e+12, APFloat(APFloat::IEEEdouble, "1.25e+12").convertToDouble());
770 EXPECT_EQ(1.25e-12, APFloat(APFloat::IEEEdouble, "1.25e-12").convertToDouble());
771 EXPECT_EQ(1024.0, APFloat(APFloat::IEEEdouble, "1024.").convertToDouble());
772 EXPECT_EQ(1024.05, APFloat(APFloat::IEEEdouble, "1024.05000").convertToDouble());
773 EXPECT_EQ(0.05, APFloat(APFloat::IEEEdouble, ".05000").convertToDouble());
774 EXPECT_EQ(2.0, APFloat(APFloat::IEEEdouble, "2.").convertToDouble());
775 EXPECT_EQ(2.0e2, APFloat(APFloat::IEEEdouble, "2.e2").convertToDouble());
776 EXPECT_EQ(2.0e+2, APFloat(APFloat::IEEEdouble, "2.e+2").convertToDouble());
777 EXPECT_EQ(2.0e-2, APFloat(APFloat::IEEEdouble, "2.e-2").convertToDouble());
778 EXPECT_EQ(2.05e2, APFloat(APFloat::IEEEdouble, "002.05000e2").convertToDouble());
779 EXPECT_EQ(2.05e+2, APFloat(APFloat::IEEEdouble, "002.05000e+2").convertToDouble());
780 EXPECT_EQ(2.05e-2, APFloat(APFloat::IEEEdouble, "002.05000e-2").convertToDouble());
781 EXPECT_EQ(2.05e12, APFloat(APFloat::IEEEdouble, "002.05000e12").convertToDouble());
782 EXPECT_EQ(2.05e+12, APFloat(APFloat::IEEEdouble, "002.05000e+12").convertToDouble());
783 EXPECT_EQ(2.05e-12, APFloat(APFloat::IEEEdouble, "002.05000e-12").convertToDouble());
John McCallb42cc682010-02-26 22:20:41 +0000784
785 // These are "carefully selected" to overflow the fast log-base
786 // calculations in APFloat.cpp
787 EXPECT_TRUE(APFloat(APFloat::IEEEdouble, "99e99999").isInfinity());
788 EXPECT_TRUE(APFloat(APFloat::IEEEdouble, "-99e99999").isInfinity());
789 EXPECT_TRUE(APFloat(APFloat::IEEEdouble, "1e-99999").isPosZero());
790 EXPECT_TRUE(APFloat(APFloat::IEEEdouble, "-1e-99999").isNegZero());
Eli Friedmand2eb07a2013-07-17 22:17:29 +0000791
792 EXPECT_EQ(2.71828, convertToDoubleFromString("2.71828"));
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000793}
794
795TEST(APFloatTest, fromHexadecimalString) {
796 EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble, "0x1p0").convertToDouble());
797 EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble, "+0x1p0").convertToDouble());
798 EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble, "-0x1p0").convertToDouble());
799
800 EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble, "0x1p+0").convertToDouble());
801 EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble, "+0x1p+0").convertToDouble());
802 EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble, "-0x1p+0").convertToDouble());
803
804 EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble, "0x1p-0").convertToDouble());
805 EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble, "+0x1p-0").convertToDouble());
806 EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble, "-0x1p-0").convertToDouble());
807
808
809 EXPECT_EQ( 2.0, APFloat(APFloat::IEEEdouble, "0x1p1").convertToDouble());
810 EXPECT_EQ(+2.0, APFloat(APFloat::IEEEdouble, "+0x1p1").convertToDouble());
811 EXPECT_EQ(-2.0, APFloat(APFloat::IEEEdouble, "-0x1p1").convertToDouble());
812
813 EXPECT_EQ( 2.0, APFloat(APFloat::IEEEdouble, "0x1p+1").convertToDouble());
814 EXPECT_EQ(+2.0, APFloat(APFloat::IEEEdouble, "+0x1p+1").convertToDouble());
815 EXPECT_EQ(-2.0, APFloat(APFloat::IEEEdouble, "-0x1p+1").convertToDouble());
816
817 EXPECT_EQ( 0.5, APFloat(APFloat::IEEEdouble, "0x1p-1").convertToDouble());
818 EXPECT_EQ(+0.5, APFloat(APFloat::IEEEdouble, "+0x1p-1").convertToDouble());
819 EXPECT_EQ(-0.5, APFloat(APFloat::IEEEdouble, "-0x1p-1").convertToDouble());
820
821
822 EXPECT_EQ( 3.0, APFloat(APFloat::IEEEdouble, "0x1.8p1").convertToDouble());
823 EXPECT_EQ(+3.0, APFloat(APFloat::IEEEdouble, "+0x1.8p1").convertToDouble());
824 EXPECT_EQ(-3.0, APFloat(APFloat::IEEEdouble, "-0x1.8p1").convertToDouble());
825
826 EXPECT_EQ( 3.0, APFloat(APFloat::IEEEdouble, "0x1.8p+1").convertToDouble());
827 EXPECT_EQ(+3.0, APFloat(APFloat::IEEEdouble, "+0x1.8p+1").convertToDouble());
828 EXPECT_EQ(-3.0, APFloat(APFloat::IEEEdouble, "-0x1.8p+1").convertToDouble());
829
830 EXPECT_EQ( 0.75, APFloat(APFloat::IEEEdouble, "0x1.8p-1").convertToDouble());
831 EXPECT_EQ(+0.75, APFloat(APFloat::IEEEdouble, "+0x1.8p-1").convertToDouble());
832 EXPECT_EQ(-0.75, APFloat(APFloat::IEEEdouble, "-0x1.8p-1").convertToDouble());
833
834
835 EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble, "0x1000.000p1").convertToDouble());
836 EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble, "+0x1000.000p1").convertToDouble());
837 EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble, "-0x1000.000p1").convertToDouble());
838
839 EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble, "0x1000.000p+1").convertToDouble());
840 EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble, "+0x1000.000p+1").convertToDouble());
841 EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble, "-0x1000.000p+1").convertToDouble());
842
843 EXPECT_EQ( 2048.0, APFloat(APFloat::IEEEdouble, "0x1000.000p-1").convertToDouble());
844 EXPECT_EQ(+2048.0, APFloat(APFloat::IEEEdouble, "+0x1000.000p-1").convertToDouble());
845 EXPECT_EQ(-2048.0, APFloat(APFloat::IEEEdouble, "-0x1000.000p-1").convertToDouble());
846
847
848 EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble, "0x1000p1").convertToDouble());
849 EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble, "+0x1000p1").convertToDouble());
850 EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble, "-0x1000p1").convertToDouble());
851
852 EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble, "0x1000p+1").convertToDouble());
853 EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble, "+0x1000p+1").convertToDouble());
854 EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble, "-0x1000p+1").convertToDouble());
855
856 EXPECT_EQ( 2048.0, APFloat(APFloat::IEEEdouble, "0x1000p-1").convertToDouble());
857 EXPECT_EQ(+2048.0, APFloat(APFloat::IEEEdouble, "+0x1000p-1").convertToDouble());
858 EXPECT_EQ(-2048.0, APFloat(APFloat::IEEEdouble, "-0x1000p-1").convertToDouble());
859
860
861 EXPECT_EQ( 16384.0, APFloat(APFloat::IEEEdouble, "0x10p10").convertToDouble());
862 EXPECT_EQ(+16384.0, APFloat(APFloat::IEEEdouble, "+0x10p10").convertToDouble());
863 EXPECT_EQ(-16384.0, APFloat(APFloat::IEEEdouble, "-0x10p10").convertToDouble());
864
865 EXPECT_EQ( 16384.0, APFloat(APFloat::IEEEdouble, "0x10p+10").convertToDouble());
866 EXPECT_EQ(+16384.0, APFloat(APFloat::IEEEdouble, "+0x10p+10").convertToDouble());
867 EXPECT_EQ(-16384.0, APFloat(APFloat::IEEEdouble, "-0x10p+10").convertToDouble());
868
869 EXPECT_EQ( 0.015625, APFloat(APFloat::IEEEdouble, "0x10p-10").convertToDouble());
870 EXPECT_EQ(+0.015625, APFloat(APFloat::IEEEdouble, "+0x10p-10").convertToDouble());
871 EXPECT_EQ(-0.015625, APFloat(APFloat::IEEEdouble, "-0x10p-10").convertToDouble());
872
873 EXPECT_EQ(1.0625, APFloat(APFloat::IEEEdouble, "0x1.1p0").convertToDouble());
874 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble, "0x1p0").convertToDouble());
Daniel Dunbarbc52e4f2009-09-03 22:57:02 +0000875
Eli Friedmand2eb07a2013-07-17 22:17:29 +0000876 EXPECT_EQ(convertToDoubleFromString("0x1p-150"),
877 convertToDoubleFromString("+0x800000000000000001.p-221"));
878 EXPECT_EQ(2251799813685248.5,
879 convertToDoubleFromString("0x80000000000004000000.010p-28"));
Erick Tryzelaar19f63b22009-08-16 23:36:19 +0000880}
881
John McCall29b5c282009-12-24 08:56:26 +0000882TEST(APFloatTest, toString) {
883 ASSERT_EQ("10", convertToString(10.0, 6, 3));
884 ASSERT_EQ("1.0E+1", convertToString(10.0, 6, 0));
885 ASSERT_EQ("10100", convertToString(1.01E+4, 5, 2));
886 ASSERT_EQ("1.01E+4", convertToString(1.01E+4, 4, 2));
887 ASSERT_EQ("1.01E+4", convertToString(1.01E+4, 5, 1));
888 ASSERT_EQ("0.0101", convertToString(1.01E-2, 5, 2));
John McCalldd5044a2009-12-24 23:18:09 +0000889 ASSERT_EQ("0.0101", convertToString(1.01E-2, 4, 2));
John McCall29b5c282009-12-24 08:56:26 +0000890 ASSERT_EQ("1.01E-2", convertToString(1.01E-2, 5, 1));
Eli Friedmane72f1322013-08-29 23:44:34 +0000891 ASSERT_EQ("0.78539816339744828", convertToString(0.78539816339744830961, 0, 3));
892 ASSERT_EQ("4.9406564584124654E-324", convertToString(4.9406564584124654e-324, 0, 3));
893 ASSERT_EQ("873.18340000000001", convertToString(873.1834, 0, 1));
894 ASSERT_EQ("8.7318340000000001E+2", convertToString(873.1834, 0, 0));
895 ASSERT_EQ("1.7976931348623157E+308", convertToString(1.7976931348623157E+308, 0, 0));
John McCall29b5c282009-12-24 08:56:26 +0000896}
897
Jeffrey Yasskin03b81a22011-07-15 07:04:56 +0000898TEST(APFloatTest, toInteger) {
899 bool isExact = false;
900 APSInt result(5, /*isUnsigned=*/true);
901
902 EXPECT_EQ(APFloat::opOK,
903 APFloat(APFloat::IEEEdouble, "10")
904 .convertToInteger(result, APFloat::rmTowardZero, &isExact));
905 EXPECT_TRUE(isExact);
906 EXPECT_EQ(APSInt(APInt(5, 10), true), result);
907
908 EXPECT_EQ(APFloat::opInvalidOp,
909 APFloat(APFloat::IEEEdouble, "-10")
910 .convertToInteger(result, APFloat::rmTowardZero, &isExact));
911 EXPECT_FALSE(isExact);
912 EXPECT_EQ(APSInt::getMinValue(5, true), result);
913
914 EXPECT_EQ(APFloat::opInvalidOp,
915 APFloat(APFloat::IEEEdouble, "32")
916 .convertToInteger(result, APFloat::rmTowardZero, &isExact));
917 EXPECT_FALSE(isExact);
918 EXPECT_EQ(APSInt::getMaxValue(5, true), result);
919
920 EXPECT_EQ(APFloat::opInexact,
921 APFloat(APFloat::IEEEdouble, "7.9")
922 .convertToInteger(result, APFloat::rmTowardZero, &isExact));
923 EXPECT_FALSE(isExact);
924 EXPECT_EQ(APSInt(APInt(5, 7), true), result);
925
926 result.setIsUnsigned(false);
927 EXPECT_EQ(APFloat::opOK,
928 APFloat(APFloat::IEEEdouble, "-10")
929 .convertToInteger(result, APFloat::rmTowardZero, &isExact));
930 EXPECT_TRUE(isExact);
931 EXPECT_EQ(APSInt(APInt(5, -10, true), false), result);
932
933 EXPECT_EQ(APFloat::opInvalidOp,
934 APFloat(APFloat::IEEEdouble, "-17")
935 .convertToInteger(result, APFloat::rmTowardZero, &isExact));
936 EXPECT_FALSE(isExact);
937 EXPECT_EQ(APSInt::getMinValue(5, false), result);
938
939 EXPECT_EQ(APFloat::opInvalidOp,
940 APFloat(APFloat::IEEEdouble, "16")
941 .convertToInteger(result, APFloat::rmTowardZero, &isExact));
942 EXPECT_FALSE(isExact);
943 EXPECT_EQ(APSInt::getMaxValue(5, false), result);
944}
945
John McCalldcb9a7a2010-02-28 02:51:25 +0000946static APInt nanbits(const fltSemantics &Sem,
947 bool SNaN, bool Negative, uint64_t fill) {
948 APInt apfill(64, fill);
949 if (SNaN)
950 return APFloat::getSNaN(Sem, Negative, &apfill).bitcastToAPInt();
951 else
952 return APFloat::getQNaN(Sem, Negative, &apfill).bitcastToAPInt();
953}
954
955TEST(APFloatTest, makeNaN) {
956 ASSERT_EQ(0x7fc00000, nanbits(APFloat::IEEEsingle, false, false, 0));
957 ASSERT_EQ(0xffc00000, nanbits(APFloat::IEEEsingle, false, true, 0));
958 ASSERT_EQ(0x7fc0ae72, nanbits(APFloat::IEEEsingle, false, false, 0xae72));
959 ASSERT_EQ(0x7fffae72, nanbits(APFloat::IEEEsingle, false, false, 0xffffae72));
960 ASSERT_EQ(0x7fa00000, nanbits(APFloat::IEEEsingle, true, false, 0));
961 ASSERT_EQ(0xffa00000, nanbits(APFloat::IEEEsingle, true, true, 0));
962 ASSERT_EQ(0x7f80ae72, nanbits(APFloat::IEEEsingle, true, false, 0xae72));
963 ASSERT_EQ(0x7fbfae72, nanbits(APFloat::IEEEsingle, true, false, 0xffffae72));
964
965 ASSERT_EQ(0x7ff8000000000000ULL, nanbits(APFloat::IEEEdouble, false, false, 0));
966 ASSERT_EQ(0xfff8000000000000ULL, nanbits(APFloat::IEEEdouble, false, true, 0));
967 ASSERT_EQ(0x7ff800000000ae72ULL, nanbits(APFloat::IEEEdouble, false, false, 0xae72));
968 ASSERT_EQ(0x7fffffffffffae72ULL, nanbits(APFloat::IEEEdouble, false, false, 0xffffffffffffae72ULL));
969 ASSERT_EQ(0x7ff4000000000000ULL, nanbits(APFloat::IEEEdouble, true, false, 0));
970 ASSERT_EQ(0xfff4000000000000ULL, nanbits(APFloat::IEEEdouble, true, true, 0));
971 ASSERT_EQ(0x7ff000000000ae72ULL, nanbits(APFloat::IEEEdouble, true, false, 0xae72));
972 ASSERT_EQ(0x7ff7ffffffffae72ULL, nanbits(APFloat::IEEEdouble, true, false, 0xffffffffffffae72ULL));
973}
974
Erick Tryzelaar927191f2009-08-17 00:55:33 +0000975#ifdef GTEST_HAS_DEATH_TEST
Jeffrey Yasskinb5cd0132010-03-17 01:18:45 +0000976#ifndef NDEBUG
Erick Tryzelaar927191f2009-08-17 00:55:33 +0000977TEST(APFloatTest, SemanticsDeath) {
978 EXPECT_DEATH(APFloat(APFloat::IEEEsingle, 0.0f).convertToDouble(), "Float semantics are not IEEEdouble");
979 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, 0.0 ).convertToFloat(), "Float semantics are not IEEEsingle");
980}
981
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000982TEST(APFloatTest, StringDecimalDeath) {
983 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ""), "Invalid string length");
984 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+"), "String has no digits");
985 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-"), "String has no digits");
Erick Tryzelaar19f63b22009-08-16 23:36:19 +0000986
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000987 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("\0", 1)), "Invalid character in significand");
988 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1\0", 2)), "Invalid character in significand");
989 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1\02", 3)), "Invalid character in significand");
990 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1\02e1", 5)), "Invalid character in significand");
Erick Tryzelaarbc0d7492009-08-17 00:14:11 +0000991 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1e\0", 3)), "Invalid character in exponent");
992 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1e1\0", 4)), "Invalid character in exponent");
993 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1e1\02", 5)), "Invalid character in exponent");
Erick Tryzelaar19f63b22009-08-16 23:36:19 +0000994
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000995 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.0f"), "Invalid character in significand");
Erick Tryzelaar19f63b22009-08-16 23:36:19 +0000996
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000997 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".."), "String contains multiple dots");
998 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "..0"), "String contains multiple dots");
999 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.0.0"), "String contains multiple dots");
1000}
1001
1002TEST(APFloatTest, StringDecimalSignificandDeath) {
1003 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "."), "Significand has no digits");
1004 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+."), "Significand has no digits");
1005 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-."), "Significand has no digits");
1006
1007
1008 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "e"), "Significand has no digits");
1009 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+e"), "Significand has no digits");
1010 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-e"), "Significand has no digits");
1011
1012 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "e1"), "Significand has no digits");
1013 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+e1"), "Significand has no digits");
1014 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-e1"), "Significand has no digits");
1015
1016 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".e1"), "Significand has no digits");
1017 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+.e1"), "Significand has no digits");
1018 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-.e1"), "Significand has no digits");
1019
1020
1021 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".e"), "Significand has no digits");
1022 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+.e"), "Significand has no digits");
1023 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-.e"), "Significand has no digits");
1024}
1025
1026TEST(APFloatTest, StringDecimalExponentDeath) {
1027 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1e"), "Exponent has no digits");
1028 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+1e"), "Exponent has no digits");
1029 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-1e"), "Exponent has no digits");
1030
1031 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.e"), "Exponent has no digits");
1032 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+1.e"), "Exponent has no digits");
1033 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-1.e"), "Exponent has no digits");
1034
1035 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".1e"), "Exponent has no digits");
1036 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+.1e"), "Exponent has no digits");
1037 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-.1e"), "Exponent has no digits");
1038
1039 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.1e"), "Exponent has no digits");
1040 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+1.1e"), "Exponent has no digits");
1041 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-1.1e"), "Exponent has no digits");
1042
1043
1044 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1e+"), "Exponent has no digits");
1045 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1e-"), "Exponent has no digits");
1046
1047 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".1e"), "Exponent has no digits");
1048 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".1e+"), "Exponent has no digits");
1049 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".1e-"), "Exponent has no digits");
1050
1051 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.0e"), "Exponent has no digits");
1052 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.0e+"), "Exponent has no digits");
1053 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.0e-"), "Exponent has no digits");
1054}
1055
1056TEST(APFloatTest, StringHexadecimalDeath) {
1057 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x"), "Invalid string");
1058 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x"), "Invalid string");
1059 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x"), "Invalid string");
1060
1061 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x0"), "Hex strings require an exponent");
1062 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x0"), "Hex strings require an exponent");
1063 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x0"), "Hex strings require an exponent");
1064
1065 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x0."), "Hex strings require an exponent");
1066 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x0."), "Hex strings require an exponent");
1067 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x0."), "Hex strings require an exponent");
1068
1069 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x.0"), "Hex strings require an exponent");
1070 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.0"), "Hex strings require an exponent");
1071 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.0"), "Hex strings require an exponent");
1072
1073 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x0.0"), "Hex strings require an exponent");
1074 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x0.0"), "Hex strings require an exponent");
1075 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x0.0"), "Hex strings require an exponent");
1076
1077 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x\0", 3)), "Invalid character in significand");
1078 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1\0", 4)), "Invalid character in significand");
1079 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1\02", 5)), "Invalid character in significand");
1080 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1\02p1", 7)), "Invalid character in significand");
Erick Tryzelaarbc0d7492009-08-17 00:14:11 +00001081 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1p\0", 5)), "Invalid character in exponent");
1082 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1p1\0", 6)), "Invalid character in exponent");
1083 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1p1\02", 7)), "Invalid character in exponent");
Erick Tryzelaar19f63b22009-08-16 23:36:19 +00001084
Erick Tryzelaarbc0d7492009-08-17 00:14:11 +00001085 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1p0f"), "Invalid character in exponent");
Erick Tryzelaarda666c82009-08-20 23:30:43 +00001086
1087 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x..p1"), "String contains multiple dots");
1088 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x..0p1"), "String contains multiple dots");
1089 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.0.0p1"), "String contains multiple dots");
1090}
1091
1092TEST(APFloatTest, StringHexadecimalSignificandDeath) {
1093 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x."), "Significand has no digits");
1094 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x."), "Significand has no digits");
1095 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x."), "Significand has no digits");
1096
1097 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0xp"), "Significand has no digits");
1098 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0xp"), "Significand has no digits");
1099 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0xp"), "Significand has no digits");
1100
1101 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0xp+"), "Significand has no digits");
1102 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0xp+"), "Significand has no digits");
1103 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0xp+"), "Significand has no digits");
1104
1105 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0xp-"), "Significand has no digits");
1106 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0xp-"), "Significand has no digits");
1107 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0xp-"), "Significand has no digits");
1108
1109
1110 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x.p"), "Significand has no digits");
1111 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.p"), "Significand has no digits");
1112 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.p"), "Significand has no digits");
1113
1114 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x.p+"), "Significand has no digits");
1115 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.p+"), "Significand has no digits");
1116 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.p+"), "Significand has no digits");
1117
1118 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x.p-"), "Significand has no digits");
1119 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.p-"), "Significand has no digits");
1120 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.p-"), "Significand has no digits");
1121}
1122
1123TEST(APFloatTest, StringHexadecimalExponentDeath) {
1124 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1p"), "Exponent has no digits");
1125 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1p"), "Exponent has no digits");
1126 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1p"), "Exponent has no digits");
1127
1128 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1p+"), "Exponent has no digits");
1129 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1p+"), "Exponent has no digits");
1130 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1p+"), "Exponent has no digits");
1131
1132 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1p-"), "Exponent has no digits");
1133 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1p-"), "Exponent has no digits");
1134 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1p-"), "Exponent has no digits");
1135
1136
1137 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.p"), "Exponent has no digits");
1138 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.p"), "Exponent has no digits");
1139 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.p"), "Exponent has no digits");
1140
1141 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.p+"), "Exponent has no digits");
1142 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.p+"), "Exponent has no digits");
1143 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.p+"), "Exponent has no digits");
1144
1145 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.p-"), "Exponent has no digits");
1146 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.p-"), "Exponent has no digits");
1147 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.p-"), "Exponent has no digits");
1148
1149
1150 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x.1p"), "Exponent has no digits");
1151 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.1p"), "Exponent has no digits");
1152 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.1p"), "Exponent has no digits");
1153
1154 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x.1p+"), "Exponent has no digits");
1155 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.1p+"), "Exponent has no digits");
1156 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.1p+"), "Exponent has no digits");
1157
1158 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x.1p-"), "Exponent has no digits");
1159 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.1p-"), "Exponent has no digits");
1160 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.1p-"), "Exponent has no digits");
1161
1162
1163 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.1p"), "Exponent has no digits");
1164 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.1p"), "Exponent has no digits");
1165 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.1p"), "Exponent has no digits");
1166
1167 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.1p+"), "Exponent has no digits");
1168 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.1p+"), "Exponent has no digits");
1169 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.1p+"), "Exponent has no digits");
1170
1171 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.1p-"), "Exponent has no digits");
1172 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.1p-"), "Exponent has no digits");
1173 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.1p-"), "Exponent has no digits");
Erick Tryzelaar19f63b22009-08-16 23:36:19 +00001174}
Erick Tryzelaar927191f2009-08-17 00:55:33 +00001175#endif
Jeffrey Yasskinb5cd0132010-03-17 01:18:45 +00001176#endif
Erick Tryzelaar19f63b22009-08-16 23:36:19 +00001177
Benjamin Kramer03fd6722011-03-30 15:42:27 +00001178TEST(APFloatTest, exactInverse) {
1179 APFloat inv(0.0f);
1180
1181 // Trivial operation.
1182 EXPECT_TRUE(APFloat(2.0).getExactInverse(&inv));
1183 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(0.5)));
1184 EXPECT_TRUE(APFloat(2.0f).getExactInverse(&inv));
1185 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(0.5f)));
Benjamin Kramer08be41a2012-11-08 13:58:10 +00001186 EXPECT_TRUE(APFloat(APFloat::IEEEquad, "2.0").getExactInverse(&inv));
1187 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(APFloat::IEEEquad, "0.5")));
1188 EXPECT_TRUE(APFloat(APFloat::PPCDoubleDouble, "2.0").getExactInverse(&inv));
1189 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(APFloat::PPCDoubleDouble, "0.5")));
1190 EXPECT_TRUE(APFloat(APFloat::x87DoubleExtended, "2.0").getExactInverse(&inv));
1191 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(APFloat::x87DoubleExtended, "0.5")));
Benjamin Kramer03fd6722011-03-30 15:42:27 +00001192
1193 // FLT_MIN
1194 EXPECT_TRUE(APFloat(1.17549435e-38f).getExactInverse(&inv));
1195 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(8.5070592e+37f)));
1196
Benjamin Krameraf0ed952011-03-30 17:02:54 +00001197 // Large float, inverse is a denormal.
Craig Topper66f09ad2014-06-08 22:29:17 +00001198 EXPECT_FALSE(APFloat(1.7014118e38f).getExactInverse(nullptr));
Benjamin Kramer03fd6722011-03-30 15:42:27 +00001199 // Zero
Craig Topper66f09ad2014-06-08 22:29:17 +00001200 EXPECT_FALSE(APFloat(0.0).getExactInverse(nullptr));
Benjamin Kramer03fd6722011-03-30 15:42:27 +00001201 // Denormalized float
Craig Topper66f09ad2014-06-08 22:29:17 +00001202 EXPECT_FALSE(APFloat(1.40129846e-45f).getExactInverse(nullptr));
Benjamin Kramer03fd6722011-03-30 15:42:27 +00001203}
1204
Owen Anderson1ff74b02012-08-15 05:39:46 +00001205TEST(APFloatTest, roundToIntegral) {
Owen Anderson352dfff2012-08-15 18:28:45 +00001206 APFloat T(-0.5), S(3.14), R(APFloat::getLargest(APFloat::IEEEdouble)), P(0.0);
Owen Anderson1ff74b02012-08-15 05:39:46 +00001207
1208 P = T;
1209 P.roundToIntegral(APFloat::rmTowardZero);
1210 EXPECT_EQ(-0.0, P.convertToDouble());
1211 P = T;
1212 P.roundToIntegral(APFloat::rmTowardNegative);
1213 EXPECT_EQ(-1.0, P.convertToDouble());
1214 P = T;
1215 P.roundToIntegral(APFloat::rmTowardPositive);
1216 EXPECT_EQ(-0.0, P.convertToDouble());
1217 P = T;
1218 P.roundToIntegral(APFloat::rmNearestTiesToEven);
1219 EXPECT_EQ(-0.0, P.convertToDouble());
1220
1221 P = S;
1222 P.roundToIntegral(APFloat::rmTowardZero);
1223 EXPECT_EQ(3.0, P.convertToDouble());
1224 P = S;
1225 P.roundToIntegral(APFloat::rmTowardNegative);
1226 EXPECT_EQ(3.0, P.convertToDouble());
1227 P = S;
1228 P.roundToIntegral(APFloat::rmTowardPositive);
1229 EXPECT_EQ(4.0, P.convertToDouble());
1230 P = S;
1231 P.roundToIntegral(APFloat::rmNearestTiesToEven);
1232 EXPECT_EQ(3.0, P.convertToDouble());
Owen Anderson352dfff2012-08-15 18:28:45 +00001233
1234 P = R;
1235 P.roundToIntegral(APFloat::rmTowardZero);
1236 EXPECT_EQ(R.convertToDouble(), P.convertToDouble());
1237 P = R;
1238 P.roundToIntegral(APFloat::rmTowardNegative);
1239 EXPECT_EQ(R.convertToDouble(), P.convertToDouble());
1240 P = R;
1241 P.roundToIntegral(APFloat::rmTowardPositive);
1242 EXPECT_EQ(R.convertToDouble(), P.convertToDouble());
1243 P = R;
1244 P.roundToIntegral(APFloat::rmNearestTiesToEven);
1245 EXPECT_EQ(R.convertToDouble(), P.convertToDouble());
Benjamin Kramerc38fab22012-09-26 14:06:58 +00001246
1247 P = APFloat::getZero(APFloat::IEEEdouble);
1248 P.roundToIntegral(APFloat::rmTowardZero);
1249 EXPECT_EQ(0.0, P.convertToDouble());
1250 P = APFloat::getZero(APFloat::IEEEdouble, true);
1251 P.roundToIntegral(APFloat::rmTowardZero);
1252 EXPECT_EQ(-0.0, P.convertToDouble());
1253 P = APFloat::getNaN(APFloat::IEEEdouble);
1254 P.roundToIntegral(APFloat::rmTowardZero);
1255 EXPECT_TRUE(IsNAN(P.convertToDouble()));
1256 P = APFloat::getInf(APFloat::IEEEdouble);
1257 P.roundToIntegral(APFloat::rmTowardZero);
1258 EXPECT_TRUE(IsInf(P.convertToDouble()) && P.convertToDouble() > 0.0);
1259 P = APFloat::getInf(APFloat::IEEEdouble, true);
1260 P.roundToIntegral(APFloat::rmTowardZero);
1261 EXPECT_TRUE(IsInf(P.convertToDouble()) && P.convertToDouble() < 0.0);
1262
Owen Anderson1ff74b02012-08-15 05:39:46 +00001263}
1264
Eli Friedmanc5322012011-10-12 21:51:36 +00001265TEST(APFloatTest, getLargest) {
Eli Friedman212e4472011-10-12 23:14:41 +00001266 EXPECT_EQ(3.402823466e+38f, APFloat::getLargest(APFloat::IEEEsingle).convertToFloat());
1267 EXPECT_EQ(1.7976931348623158e+308, APFloat::getLargest(APFloat::IEEEdouble).convertToDouble());
Eli Friedmanc5322012011-10-12 21:51:36 +00001268}
1269
Michael Gottesman63e6d212013-05-29 23:58:29 +00001270TEST(APFloatTest, getSmallest) {
1271 APFloat test = APFloat::getSmallest(APFloat::IEEEsingle, false);
1272 APFloat expected = APFloat(APFloat::IEEEsingle, "0x0.000002p-126");
Michael Gottesman5455d5b2013-05-30 00:18:44 +00001273 EXPECT_FALSE(test.isNegative());
Michael Gottesmanb5101ab2013-06-19 21:53:45 +00001274 EXPECT_TRUE(test.isFiniteNonZero());
Michael Gottesman5455d5b2013-05-30 00:18:44 +00001275 EXPECT_TRUE(test.isDenormal());
Michael Gottesman63e6d212013-05-29 23:58:29 +00001276 EXPECT_TRUE(test.bitwiseIsEqual(expected));
1277
1278 test = APFloat::getSmallest(APFloat::IEEEsingle, true);
1279 expected = APFloat(APFloat::IEEEsingle, "-0x0.000002p-126");
1280 EXPECT_TRUE(test.isNegative());
Michael Gottesmanb5101ab2013-06-19 21:53:45 +00001281 EXPECT_TRUE(test.isFiniteNonZero());
Michael Gottesman5455d5b2013-05-30 00:18:44 +00001282 EXPECT_TRUE(test.isDenormal());
Michael Gottesman63e6d212013-05-29 23:58:29 +00001283 EXPECT_TRUE(test.bitwiseIsEqual(expected));
1284
1285 test = APFloat::getSmallest(APFloat::IEEEquad, false);
1286 expected = APFloat(APFloat::IEEEquad, "0x0.0000000000000000000000000001p-16382");
Michael Gottesman5455d5b2013-05-30 00:18:44 +00001287 EXPECT_FALSE(test.isNegative());
Michael Gottesmanb5101ab2013-06-19 21:53:45 +00001288 EXPECT_TRUE(test.isFiniteNonZero());
Michael Gottesman5455d5b2013-05-30 00:18:44 +00001289 EXPECT_TRUE(test.isDenormal());
Michael Gottesman63e6d212013-05-29 23:58:29 +00001290 EXPECT_TRUE(test.bitwiseIsEqual(expected));
1291
1292 test = APFloat::getSmallest(APFloat::IEEEquad, true);
1293 expected = APFloat(APFloat::IEEEquad, "-0x0.0000000000000000000000000001p-16382");
1294 EXPECT_TRUE(test.isNegative());
Michael Gottesmanb5101ab2013-06-19 21:53:45 +00001295 EXPECT_TRUE(test.isFiniteNonZero());
Michael Gottesman5455d5b2013-05-30 00:18:44 +00001296 EXPECT_TRUE(test.isDenormal());
Michael Gottesmanf9899292013-06-24 09:58:09 +00001297 EXPECT_TRUE(test.bitwiseIsEqual(expected));
Michael Gottesman63e6d212013-05-29 23:58:29 +00001298}
1299
Michael Gottesman0db7c272013-05-30 00:18:47 +00001300TEST(APFloatTest, getSmallestNormalized) {
1301 APFloat test = APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
1302 APFloat expected = APFloat(APFloat::IEEEsingle, "0x1p-126");
1303 EXPECT_FALSE(test.isNegative());
Michael Gottesmanb5101ab2013-06-19 21:53:45 +00001304 EXPECT_TRUE(test.isFiniteNonZero());
Michael Gottesman0db7c272013-05-30 00:18:47 +00001305 EXPECT_FALSE(test.isDenormal());
1306 EXPECT_TRUE(test.bitwiseIsEqual(expected));
1307
1308 test = APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
1309 expected = APFloat(APFloat::IEEEsingle, "-0x1p-126");
1310 EXPECT_TRUE(test.isNegative());
Michael Gottesmanb5101ab2013-06-19 21:53:45 +00001311 EXPECT_TRUE(test.isFiniteNonZero());
Michael Gottesman0db7c272013-05-30 00:18:47 +00001312 EXPECT_FALSE(test.isDenormal());
1313 EXPECT_TRUE(test.bitwiseIsEqual(expected));
1314
1315 test = APFloat::getSmallestNormalized(APFloat::IEEEquad, false);
1316 expected = APFloat(APFloat::IEEEquad, "0x1p-16382");
1317 EXPECT_FALSE(test.isNegative());
Michael Gottesmanb5101ab2013-06-19 21:53:45 +00001318 EXPECT_TRUE(test.isFiniteNonZero());
Michael Gottesman0db7c272013-05-30 00:18:47 +00001319 EXPECT_FALSE(test.isDenormal());
1320 EXPECT_TRUE(test.bitwiseIsEqual(expected));
1321
1322 test = APFloat::getSmallestNormalized(APFloat::IEEEquad, true);
1323 expected = APFloat(APFloat::IEEEquad, "-0x1p-16382");
1324 EXPECT_TRUE(test.isNegative());
Michael Gottesmanb5101ab2013-06-19 21:53:45 +00001325 EXPECT_TRUE(test.isFiniteNonZero());
Michael Gottesman0db7c272013-05-30 00:18:47 +00001326 EXPECT_FALSE(test.isDenormal());
Michael Gottesmanf9899292013-06-24 09:58:09 +00001327 EXPECT_TRUE(test.bitwiseIsEqual(expected));
Michael Gottesman0db7c272013-05-30 00:18:47 +00001328}
1329
Michael Gottesmanfc718c92013-05-31 18:43:34 +00001330TEST(APFloatTest, getZero) {
1331 struct {
1332 const fltSemantics *semantics;
1333 const bool sign;
1334 const unsigned long long bitPattern[2];
1335 const unsigned bitPatternLength;
Benjamin Kramer0bb474f2013-06-01 22:29:41 +00001336 } const GetZeroTest[] = {
Michael Gottesmanfc718c92013-05-31 18:43:34 +00001337 { &APFloat::IEEEhalf, false, {0, 0}, 1},
Benjamin Kramer0bb474f2013-06-01 22:29:41 +00001338 { &APFloat::IEEEhalf, true, {0x8000ULL, 0}, 1},
Michael Gottesmanfc718c92013-05-31 18:43:34 +00001339 { &APFloat::IEEEsingle, false, {0, 0}, 1},
Benjamin Kramer0bb474f2013-06-01 22:29:41 +00001340 { &APFloat::IEEEsingle, true, {0x80000000ULL, 0}, 1},
Michael Gottesmanfc718c92013-05-31 18:43:34 +00001341 { &APFloat::IEEEdouble, false, {0, 0}, 1},
Benjamin Kramer0bb474f2013-06-01 22:29:41 +00001342 { &APFloat::IEEEdouble, true, {0x8000000000000000ULL, 0}, 1},
Michael Gottesmanfc718c92013-05-31 18:43:34 +00001343 { &APFloat::IEEEquad, false, {0, 0}, 2},
Benjamin Kramer0bb474f2013-06-01 22:29:41 +00001344 { &APFloat::IEEEquad, true, {0, 0x8000000000000000ULL}, 2},
Michael Gottesmanfc718c92013-05-31 18:43:34 +00001345 { &APFloat::PPCDoubleDouble, false, {0, 0}, 2},
Benjamin Kramer0bb474f2013-06-01 22:29:41 +00001346 { &APFloat::PPCDoubleDouble, true, {0x8000000000000000ULL, 0}, 2},
Michael Gottesmanfc718c92013-05-31 18:43:34 +00001347 { &APFloat::x87DoubleExtended, false, {0, 0}, 2},
Benjamin Kramer0bb474f2013-06-01 22:29:41 +00001348 { &APFloat::x87DoubleExtended, true, {0, 0x8000ULL}, 2},
Michael Gottesmanfc718c92013-05-31 18:43:34 +00001349 };
1350 const unsigned NumGetZeroTests = 12;
1351 for (unsigned i = 0; i < NumGetZeroTests; ++i) {
1352 APFloat test = APFloat::getZero(*GetZeroTest[i].semantics,
1353 GetZeroTest[i].sign);
1354 const char *pattern = GetZeroTest[i].sign? "-0x0p+0" : "0x0p+0";
1355 APFloat expected = APFloat(*GetZeroTest[i].semantics,
1356 pattern);
1357 EXPECT_TRUE(test.isZero());
1358 EXPECT_TRUE(GetZeroTest[i].sign? test.isNegative() : !test.isNegative());
1359 EXPECT_TRUE(test.bitwiseIsEqual(expected));
1360 for (unsigned j = 0, je = GetZeroTest[i].bitPatternLength; j < je; ++j) {
1361 EXPECT_EQ(GetZeroTest[i].bitPattern[j],
1362 test.bitcastToAPInt().getRawData()[j]);
1363 }
1364 }
1365}
1366
Chandler Carruthdf782e42014-10-09 23:26:15 +00001367TEST(APFloatTest, copySign) {
1368 EXPECT_TRUE(APFloat(-42.0).bitwiseIsEqual(
1369 APFloat::copySign(APFloat(42.0), APFloat(-1.0))));
1370 EXPECT_TRUE(APFloat(42.0).bitwiseIsEqual(
1371 APFloat::copySign(APFloat(-42.0), APFloat(1.0))));
1372 EXPECT_TRUE(APFloat(-42.0).bitwiseIsEqual(
1373 APFloat::copySign(APFloat(-42.0), APFloat(-1.0))));
1374 EXPECT_TRUE(APFloat(42.0).bitwiseIsEqual(
1375 APFloat::copySign(APFloat(42.0), APFloat(1.0))));
1376}
1377
Eli Friedmana84ad7d2011-11-26 03:38:02 +00001378TEST(APFloatTest, convert) {
1379 bool losesInfo;
1380 APFloat test(APFloat::IEEEdouble, "1.0");
1381 test.convert(APFloat::IEEEsingle, APFloat::rmNearestTiesToEven, &losesInfo);
1382 EXPECT_EQ(1.0f, test.convertToFloat());
1383 EXPECT_FALSE(losesInfo);
1384
1385 test = APFloat(APFloat::x87DoubleExtended, "0x1p-53");
1386 test.add(APFloat(APFloat::x87DoubleExtended, "1.0"), APFloat::rmNearestTiesToEven);
1387 test.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, &losesInfo);
1388 EXPECT_EQ(1.0, test.convertToDouble());
1389 EXPECT_TRUE(losesInfo);
1390
1391 test = APFloat(APFloat::IEEEquad, "0x1p-53");
1392 test.add(APFloat(APFloat::IEEEquad, "1.0"), APFloat::rmNearestTiesToEven);
1393 test.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, &losesInfo);
1394 EXPECT_EQ(1.0, test.convertToDouble());
1395 EXPECT_TRUE(losesInfo);
1396
1397 test = APFloat(APFloat::x87DoubleExtended, "0xf.fffffffp+28");
1398 test.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, &losesInfo);
1399 EXPECT_EQ(4294967295.0, test.convertToDouble());
1400 EXPECT_FALSE(losesInfo);
Benjamin Kramerb361adb2013-01-25 17:01:00 +00001401
1402 test = APFloat::getSNaN(APFloat::IEEEsingle);
1403 APFloat X87SNaN = APFloat::getSNaN(APFloat::x87DoubleExtended);
1404 test.convert(APFloat::x87DoubleExtended, APFloat::rmNearestTiesToEven,
1405 &losesInfo);
1406 EXPECT_TRUE(test.bitwiseIsEqual(X87SNaN));
1407 EXPECT_FALSE(losesInfo);
1408
1409 test = APFloat::getQNaN(APFloat::IEEEsingle);
1410 APFloat X87QNaN = APFloat::getQNaN(APFloat::x87DoubleExtended);
1411 test.convert(APFloat::x87DoubleExtended, APFloat::rmNearestTiesToEven,
1412 &losesInfo);
1413 EXPECT_TRUE(test.bitwiseIsEqual(X87QNaN));
1414 EXPECT_FALSE(losesInfo);
1415
1416 test = APFloat::getSNaN(APFloat::x87DoubleExtended);
1417 test.convert(APFloat::x87DoubleExtended, APFloat::rmNearestTiesToEven,
1418 &losesInfo);
1419 EXPECT_TRUE(test.bitwiseIsEqual(X87SNaN));
1420 EXPECT_FALSE(losesInfo);
1421
1422 test = APFloat::getQNaN(APFloat::x87DoubleExtended);
1423 test.convert(APFloat::x87DoubleExtended, APFloat::rmNearestTiesToEven,
1424 &losesInfo);
1425 EXPECT_TRUE(test.bitwiseIsEqual(X87QNaN));
1426 EXPECT_FALSE(losesInfo);
Eli Friedmana84ad7d2011-11-26 03:38:02 +00001427}
Ulrich Weigandd9f7e252012-10-29 18:09:01 +00001428
1429TEST(APFloatTest, PPCDoubleDouble) {
1430 APFloat test(APFloat::PPCDoubleDouble, "1.0");
1431 EXPECT_EQ(0x3ff0000000000000ull, test.bitcastToAPInt().getRawData()[0]);
1432 EXPECT_EQ(0x0000000000000000ull, test.bitcastToAPInt().getRawData()[1]);
1433
1434 test.divide(APFloat(APFloat::PPCDoubleDouble, "3.0"), APFloat::rmNearestTiesToEven);
1435 EXPECT_EQ(0x3fd5555555555555ull, test.bitcastToAPInt().getRawData()[0]);
1436 EXPECT_EQ(0x3c75555555555556ull, test.bitcastToAPInt().getRawData()[1]);
1437
1438 // LDBL_MAX
1439 test = APFloat(APFloat::PPCDoubleDouble, "1.79769313486231580793728971405301e+308");
1440 EXPECT_EQ(0x7fefffffffffffffull, test.bitcastToAPInt().getRawData()[0]);
1441 EXPECT_EQ(0x7c8ffffffffffffeull, test.bitcastToAPInt().getRawData()[1]);
1442
1443 // LDBL_MIN
1444 test = APFloat(APFloat::PPCDoubleDouble, "2.00416836000897277799610805135016e-292");
1445 EXPECT_EQ(0x0360000000000000ull, test.bitcastToAPInt().getRawData()[0]);
1446 EXPECT_EQ(0x0000000000000000ull, test.bitcastToAPInt().getRawData()[1]);
1447
1448 test = APFloat(APFloat::PPCDoubleDouble, "1.0");
1449 test.add(APFloat(APFloat::PPCDoubleDouble, "0x1p-105"), APFloat::rmNearestTiesToEven);
1450 EXPECT_EQ(0x3ff0000000000000ull, test.bitcastToAPInt().getRawData()[0]);
1451 EXPECT_EQ(0x3960000000000000ull, test.bitcastToAPInt().getRawData()[1]);
1452
1453 test = APFloat(APFloat::PPCDoubleDouble, "1.0");
1454 test.add(APFloat(APFloat::PPCDoubleDouble, "0x1p-106"), APFloat::rmNearestTiesToEven);
1455 EXPECT_EQ(0x3ff0000000000000ull, test.bitcastToAPInt().getRawData()[0]);
1456#if 0 // XFAIL
1457 // This is what we would expect with a true double-double implementation
1458 EXPECT_EQ(0x3950000000000000ull, test.bitcastToAPInt().getRawData()[1]);
1459#else
1460 // This is what we get with our 106-bit mantissa approximation
1461 EXPECT_EQ(0x0000000000000000ull, test.bitcastToAPInt().getRawData()[1]);
1462#endif
1463}
Michael Gottesman3acedb62013-06-04 03:46:25 +00001464
1465TEST(APFloatTest, isNegative) {
1466 APFloat t(APFloat::IEEEsingle, "0x1p+0");
1467 EXPECT_FALSE(t.isNegative());
1468 t = APFloat(APFloat::IEEEsingle, "-0x1p+0");
1469 EXPECT_TRUE(t.isNegative());
Michael Gottesmanf9899292013-06-24 09:58:09 +00001470
Michael Gottesman3acedb62013-06-04 03:46:25 +00001471 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, false).isNegative());
1472 EXPECT_TRUE(APFloat::getInf(APFloat::IEEEsingle, true).isNegative());
Michael Gottesmanf9899292013-06-24 09:58:09 +00001473
Michael Gottesman3acedb62013-06-04 03:46:25 +00001474 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, false).isNegative());
1475 EXPECT_TRUE(APFloat::getZero(APFloat::IEEEsingle, true).isNegative());
1476
1477 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, false).isNegative());
1478 EXPECT_TRUE(APFloat::getNaN(APFloat::IEEEsingle, true).isNegative());
1479
1480 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, false).isNegative());
1481 EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle, true).isNegative());
1482}
1483
Michael Gottesman120c92882013-06-20 18:34:38 +00001484TEST(APFloatTest, isNormal) {
Michael Gottesman3acedb62013-06-04 03:46:25 +00001485 APFloat t(APFloat::IEEEsingle, "0x1p+0");
Michael Gottesman120c92882013-06-20 18:34:38 +00001486 EXPECT_TRUE(t.isNormal());
Michael Gottesmanf9899292013-06-24 09:58:09 +00001487
Michael Gottesman120c92882013-06-20 18:34:38 +00001488 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, false).isNormal());
1489 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, false).isNormal());
1490 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, false).isNormal());
Michael Gottesmanf9899292013-06-24 09:58:09 +00001491 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, false).isNormal());
Michael Gottesman120c92882013-06-20 18:34:38 +00001492 EXPECT_FALSE(APFloat(APFloat::IEEEsingle, "0x1p-149").isNormal());
Michael Gottesman3acedb62013-06-04 03:46:25 +00001493}
1494
1495TEST(APFloatTest, isFinite) {
1496 APFloat t(APFloat::IEEEsingle, "0x1p+0");
Michael Gottesmanf9899292013-06-24 09:58:09 +00001497 EXPECT_TRUE(t.isFinite());
Michael Gottesman3acedb62013-06-04 03:46:25 +00001498 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, false).isFinite());
1499 EXPECT_TRUE(APFloat::getZero(APFloat::IEEEsingle, false).isFinite());
1500 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, false).isFinite());
Michael Gottesmanf9899292013-06-24 09:58:09 +00001501 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, false).isFinite());
1502 EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "0x1p-149").isFinite());
Michael Gottesman3acedb62013-06-04 03:46:25 +00001503}
1504
1505TEST(APFloatTest, isInfinity) {
1506 APFloat t(APFloat::IEEEsingle, "0x1p+0");
1507 EXPECT_FALSE(t.isInfinity());
1508 EXPECT_TRUE(APFloat::getInf(APFloat::IEEEsingle, false).isInfinity());
1509 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, false).isInfinity());
1510 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, false).isInfinity());
Michael Gottesmanf9899292013-06-24 09:58:09 +00001511 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, false).isInfinity());
Michael Gottesmand7c05612013-06-20 18:25:16 +00001512 EXPECT_FALSE(APFloat(APFloat::IEEEsingle, "0x1p-149").isInfinity());
Michael Gottesman3acedb62013-06-04 03:46:25 +00001513}
1514
1515TEST(APFloatTest, isNaN) {
1516 APFloat t(APFloat::IEEEsingle, "0x1p+0");
Michael Gottesmanf9899292013-06-24 09:58:09 +00001517 EXPECT_FALSE(t.isNaN());
Michael Gottesman3acedb62013-06-04 03:46:25 +00001518 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, false).isNaN());
1519 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, false).isNaN());
1520 EXPECT_TRUE(APFloat::getNaN(APFloat::IEEEsingle, false).isNaN());
Michael Gottesmanf9899292013-06-24 09:58:09 +00001521 EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle, false).isNaN());
Michael Gottesmand7c05612013-06-20 18:25:16 +00001522 EXPECT_FALSE(APFloat(APFloat::IEEEsingle, "0x1p-149").isNaN());
Michael Gottesman3acedb62013-06-04 03:46:25 +00001523}
1524
Michael Gottesmand95d4472013-06-19 21:00:17 +00001525TEST(APFloatTest, isFiniteNonZero) {
1526 // Test positive/negative normal value.
1527 EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "0x1p+0").isFiniteNonZero());
1528 EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "-0x1p+0").isFiniteNonZero());
1529
1530 // Test positive/negative denormal value.
1531 EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "0x1p-149").isFiniteNonZero());
1532 EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "-0x1p-149").isFiniteNonZero());
1533
1534 // Test +/- Infinity.
1535 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, false).isFiniteNonZero());
1536 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, true).isFiniteNonZero());
1537
1538 // Test +/- Zero.
1539 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, false).isFiniteNonZero());
1540 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, true).isFiniteNonZero());
1541
1542 // Test +/- qNaN. +/- dont mean anything with qNaN but paranoia can't hurt in
1543 // this instance.
1544 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, false).isFiniteNonZero());
1545 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, true).isFiniteNonZero());
1546
1547 // Test +/- sNaN. +/- dont mean anything with sNaN but paranoia can't hurt in
1548 // this instance.
Michael Gottesmanf9899292013-06-24 09:58:09 +00001549 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, false).isFiniteNonZero());
1550 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, true).isFiniteNonZero());
Michael Gottesmand95d4472013-06-19 21:00:17 +00001551}
1552
Michael Gottesmane45b1082013-06-24 09:58:07 +00001553TEST(APFloatTest, add) {
1554 // Test Special Cases against each other and normal values.
1555
1556 // TODOS/NOTES:
1557 // 1. Since we perform only default exception handling all operations with
1558 // signaling NaNs should have a result that is a quiet NaN. Currently they
1559 // return sNaN.
Michael Gottesmane45b1082013-06-24 09:58:07 +00001560
1561 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false);
1562 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true);
1563 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false);
1564 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true);
1565 APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle, false);
1566 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle, false);
1567 APFloat PNormalValue = APFloat(APFloat::IEEEsingle, "0x1p+0");
1568 APFloat MNormalValue = APFloat(APFloat::IEEEsingle, "-0x1p+0");
1569 APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle, false);
1570 APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle, true);
1571 APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, false);
1572 APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, true);
1573 APFloat PSmallestNormalized =
1574 APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
1575 APFloat MSmallestNormalized =
1576 APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
1577
1578 const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact;
1579
1580 const unsigned NumTests = 169;
1581 struct {
1582 APFloat x;
1583 APFloat y;
1584 const char *result;
1585 int status;
1586 int category;
1587 } SpecialCaseTests[NumTests] = {
1588 { PInf, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1589 { PInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1590 { PInf, PZero, "inf", APFloat::opOK, APFloat::fcInfinity },
1591 { PInf, MZero, "inf", APFloat::opOK, APFloat::fcInfinity },
1592 { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1593#if 0
1594 // See Note 1.
1595 { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1596#endif
1597 { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1598 { PInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1599 { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1600 { PInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1601 { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1602 { PInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1603 { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
1604 { PInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
1605 { MInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1606 { MInf, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1607 { MInf, PZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
1608 { MInf, MZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00001609 { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmane45b1082013-06-24 09:58:07 +00001610#if 0
1611 // See Note 1.
1612 { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1613#endif
1614 { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1615 { MInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1616 { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1617 { MInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1618 { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1619 { MInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1620 { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
1621 { MInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
1622 { PZero, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1623 { PZero, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1624 { PZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1625 { PZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1626 { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1627#if 0
1628 // See Note 1.
1629 { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1630#endif
1631 { PZero, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
1632 { PZero, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
1633 { PZero, PLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1634 { PZero, MLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1635 { PZero, PSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
1636 { PZero, MSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
1637 { PZero, PSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
1638 { PZero, MSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
1639 { MZero, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1640 { MZero, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1641 { MZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1642 { MZero, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00001643 { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmane45b1082013-06-24 09:58:07 +00001644#if 0
1645 // See Note 1.
1646 { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1647#endif
1648 { MZero, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
1649 { MZero, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
1650 { MZero, PLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1651 { MZero, MLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1652 { MZero, PSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
1653 { MZero, MSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
1654 { MZero, PSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
1655 { MZero, MSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
1656 { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN },
1657 { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN },
1658 { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN },
1659 { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN },
1660 { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1661#if 0
1662 // See Note 1.
1663 { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1664#endif
1665 { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
1666 { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
1667 { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
1668 { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
1669 { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
1670 { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
1671 { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
1672 { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
1673#if 0
1674 // See Note 1.
1675 { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1676 { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1677 { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1678 { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1679 { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1680 { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1681 { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1682 { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1683 { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1684 { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1685 { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1686 { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1687 { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1688 { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1689#endif
1690 { PNormalValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1691 { PNormalValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1692 { PNormalValue, PZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
1693 { PNormalValue, MZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
1694 { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1695#if 0
1696 // See Note 1.
1697 { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1698#endif
1699 { PNormalValue, PNormalValue, "0x1p+1", APFloat::opOK, APFloat::fcNormal },
1700 { PNormalValue, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1701 { PNormalValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1702 { PNormalValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1703 { PNormalValue, PSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1704 { PNormalValue, MSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1705 { PNormalValue, PSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1706 { PNormalValue, MSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1707 { MNormalValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1708 { MNormalValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1709 { MNormalValue, PZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
1710 { MNormalValue, MZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00001711 { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmane45b1082013-06-24 09:58:07 +00001712#if 0
1713 // See Note 1.
1714 { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1715#endif
1716 { MNormalValue, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1717 { MNormalValue, MNormalValue, "-0x1p+1", APFloat::opOK, APFloat::fcNormal },
1718 { MNormalValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1719 { MNormalValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1720 { MNormalValue, PSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1721 { MNormalValue, MSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1722 { MNormalValue, PSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1723 { MNormalValue, MSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1724 { PLargestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1725 { PLargestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1726 { PLargestValue, PZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1727 { PLargestValue, MZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1728 { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1729#if 0
1730 // See Note 1.
1731 { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1732#endif
1733 { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1734 { PLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1735 { PLargestValue, PLargestValue, "inf", OverflowStatus, APFloat::fcInfinity },
1736 { PLargestValue, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1737 { PLargestValue, PSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1738 { PLargestValue, MSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1739 { PLargestValue, PSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1740 { PLargestValue, MSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1741 { MLargestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1742 { MLargestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1743 { MLargestValue, PZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1744 { MLargestValue, MZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00001745 { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmane45b1082013-06-24 09:58:07 +00001746#if 0
1747 // See Note 1.
1748 { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1749#endif
1750 { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1751 { MLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1752 { MLargestValue, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1753 { MLargestValue, MLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
1754 { MLargestValue, PSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1755 { MLargestValue, MSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1756 { MLargestValue, PSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1757 { MLargestValue, MSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1758 { PSmallestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1759 { PSmallestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1760 { PSmallestValue, PZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
1761 { PSmallestValue, MZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
1762 { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1763#if 0
1764 // See Note 1.
1765 { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1766#endif
1767 { PSmallestValue, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1768 { PSmallestValue, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1769 { PSmallestValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1770 { PSmallestValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1771 { PSmallestValue, PSmallestValue, "0x1p-148", APFloat::opOK, APFloat::fcNormal },
1772 { PSmallestValue, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1773 { PSmallestValue, PSmallestNormalized, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
1774 { PSmallestValue, MSmallestNormalized, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
1775 { MSmallestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1776 { MSmallestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1777 { MSmallestValue, PZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
1778 { MSmallestValue, MZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00001779 { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmane45b1082013-06-24 09:58:07 +00001780#if 0
1781 // See Note 1.
1782 { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1783#endif
1784 { MSmallestValue, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1785 { MSmallestValue, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1786 { MSmallestValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1787 { MSmallestValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1788 { MSmallestValue, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1789 { MSmallestValue, MSmallestValue, "-0x1p-148", APFloat::opOK, APFloat::fcNormal },
1790 { MSmallestValue, PSmallestNormalized, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
1791 { MSmallestValue, MSmallestNormalized, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
1792 { PSmallestNormalized, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1793 { PSmallestNormalized, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1794 { PSmallestNormalized, PZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
1795 { PSmallestNormalized, MZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
1796 { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1797#if 0
1798// See Note 1.
1799 { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1800#endif
1801 { PSmallestNormalized, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1802 { PSmallestNormalized, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1803 { PSmallestNormalized, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1804 { PSmallestNormalized, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1805 { PSmallestNormalized, PSmallestValue, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
1806 { PSmallestNormalized, MSmallestValue, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
1807 { PSmallestNormalized, PSmallestNormalized, "0x1p-125", APFloat::opOK, APFloat::fcNormal },
1808 { PSmallestNormalized, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1809 { MSmallestNormalized, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1810 { MSmallestNormalized, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1811 { MSmallestNormalized, PZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
1812 { MSmallestNormalized, MZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00001813 { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmane45b1082013-06-24 09:58:07 +00001814#if 0
1815 // See Note 1.
1816 { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1817#endif
1818 { MSmallestNormalized, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1819 { MSmallestNormalized, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1820 { MSmallestNormalized, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1821 { MSmallestNormalized, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1822 { MSmallestNormalized, PSmallestValue, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
1823 { MSmallestNormalized, MSmallestValue, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
1824 { MSmallestNormalized, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1825 { MSmallestNormalized, MSmallestNormalized, "-0x1p-125", APFloat::opOK, APFloat::fcNormal }
1826 };
1827
1828 for (size_t i = 0; i < NumTests; ++i) {
1829 APFloat x(SpecialCaseTests[i].x);
1830 APFloat y(SpecialCaseTests[i].y);
1831 APFloat::opStatus status = x.add(y, APFloat::rmNearestTiesToEven);
1832
1833 APFloat result(APFloat::IEEEsingle, SpecialCaseTests[i].result);
1834
Michael Gottesmane45b1082013-06-24 09:58:07 +00001835 EXPECT_TRUE(result.bitwiseIsEqual(x));
1836 EXPECT_TRUE((int)status == SpecialCaseTests[i].status);
1837 EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category);
1838 }
1839}
1840
Michael Gottesman9368a532013-06-26 23:55:23 +00001841TEST(APFloatTest, subtract) {
1842 // Test Special Cases against each other and normal values.
1843
1844 // TODOS/NOTES:
1845 // 1. Since we perform only default exception handling all operations with
1846 // signaling NaNs should have a result that is a quiet NaN. Currently they
1847 // return sNaN.
Michael Gottesman9368a532013-06-26 23:55:23 +00001848
1849 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false);
1850 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true);
1851 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false);
1852 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true);
1853 APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle, false);
1854 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle, false);
1855 APFloat PNormalValue = APFloat(APFloat::IEEEsingle, "0x1p+0");
1856 APFloat MNormalValue = APFloat(APFloat::IEEEsingle, "-0x1p+0");
1857 APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle, false);
1858 APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle, true);
1859 APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, false);
1860 APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, true);
1861 APFloat PSmallestNormalized =
1862 APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
1863 APFloat MSmallestNormalized =
1864 APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
1865
1866 const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact;
1867
1868 const unsigned NumTests = 169;
1869 struct {
1870 APFloat x;
1871 APFloat y;
1872 const char *result;
1873 int status;
1874 int category;
1875 } SpecialCaseTests[NumTests] = {
1876 { PInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1877 { PInf, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1878 { PInf, PZero, "inf", APFloat::opOK, APFloat::fcInfinity },
1879 { PInf, MZero, "inf", APFloat::opOK, APFloat::fcInfinity },
Stephen Canond3278282014-06-08 16:53:31 +00001880 { PInf, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001881#if 0
1882// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00001883 { PInf, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001884#endif
1885 { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1886 { PInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1887 { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1888 { PInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1889 { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1890 { PInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1891 { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
1892 { PInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
1893 { MInf, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1894 { MInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1895 { MInf, PZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
1896 { MInf, MZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
Stephen Canond3278282014-06-08 16:53:31 +00001897 { MInf, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001898#if 0
1899// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00001900 { MInf, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001901#endif
1902 { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1903 { MInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1904 { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1905 { MInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1906 { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1907 { MInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1908 { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
1909 { MInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
1910 { PZero, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1911 { PZero, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1912 { PZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1913 { PZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
Stephen Canond3278282014-06-08 16:53:31 +00001914 { PZero, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001915#if 0
1916// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00001917 { PZero, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001918#endif
1919 { PZero, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
1920 { PZero, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
1921 { PZero, PLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1922 { PZero, MLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1923 { PZero, PSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
1924 { PZero, MSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
1925 { PZero, PSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
1926 { PZero, MSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
1927 { MZero, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1928 { MZero, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1929 { MZero, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
1930 { MZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
Stephen Canond3278282014-06-08 16:53:31 +00001931 { MZero, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001932#if 0
1933// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00001934 { MZero, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001935#endif
1936 { MZero, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
1937 { MZero, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
1938 { MZero, PLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1939 { MZero, MLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1940 { MZero, PSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
1941 { MZero, MSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
1942 { MZero, PSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
1943 { MZero, MSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
1944 { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN },
1945 { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN },
1946 { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN },
1947 { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN },
1948 { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1949#if 0
1950// See Note 1.
1951 { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1952#endif
1953 { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
1954 { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
1955 { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
1956 { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
1957 { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
1958 { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
1959 { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
1960 { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
1961#if 0
1962// See Note 1.
1963 { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1964 { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1965 { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1966 { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1967 { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1968 { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1969 { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1970 { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1971 { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1972 { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1973 { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1974 { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1975 { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1976 { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1977#endif
1978 { PNormalValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1979 { PNormalValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1980 { PNormalValue, PZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
1981 { PNormalValue, MZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
Stephen Canond3278282014-06-08 16:53:31 +00001982 { PNormalValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001983#if 0
1984// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00001985 { PNormalValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001986#endif
1987 { PNormalValue, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1988 { PNormalValue, MNormalValue, "0x1p+1", APFloat::opOK, APFloat::fcNormal },
1989 { PNormalValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1990 { PNormalValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1991 { PNormalValue, PSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1992 { PNormalValue, MSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1993 { PNormalValue, PSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1994 { PNormalValue, MSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1995 { MNormalValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1996 { MNormalValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1997 { MNormalValue, PZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
1998 { MNormalValue, MZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
Stephen Canond3278282014-06-08 16:53:31 +00001999 { MNormalValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002000#if 0
2001// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00002002 { MNormalValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002003#endif
2004 { MNormalValue, PNormalValue, "-0x1p+1", APFloat::opOK, APFloat::fcNormal },
2005 { MNormalValue, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2006 { MNormalValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2007 { MNormalValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2008 { MNormalValue, PSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2009 { MNormalValue, MSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2010 { MNormalValue, PSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2011 { MNormalValue, MSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2012 { PLargestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2013 { PLargestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2014 { PLargestValue, PZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2015 { PLargestValue, MZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
Stephen Canond3278282014-06-08 16:53:31 +00002016 { PLargestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002017#if 0
2018// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00002019 { PLargestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002020#endif
2021 { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2022 { PLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2023 { PLargestValue, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2024 { PLargestValue, MLargestValue, "inf", OverflowStatus, APFloat::fcInfinity },
2025 { PLargestValue, PSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2026 { PLargestValue, MSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2027 { PLargestValue, PSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2028 { PLargestValue, MSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2029 { MLargestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2030 { MLargestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2031 { MLargestValue, PZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2032 { MLargestValue, MZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
Stephen Canond3278282014-06-08 16:53:31 +00002033 { MLargestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002034#if 0
2035// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00002036 { MLargestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002037#endif
2038 { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2039 { MLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2040 { MLargestValue, PLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
2041 { MLargestValue, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2042 { MLargestValue, PSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2043 { MLargestValue, MSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2044 { MLargestValue, PSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2045 { MLargestValue, MSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2046 { PSmallestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2047 { PSmallestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2048 { PSmallestValue, PZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2049 { PSmallestValue, MZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
Stephen Canond3278282014-06-08 16:53:31 +00002050 { PSmallestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002051#if 0
2052// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00002053 { PSmallestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002054#endif
2055 { PSmallestValue, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2056 { PSmallestValue, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2057 { PSmallestValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2058 { PSmallestValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2059 { PSmallestValue, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2060 { PSmallestValue, MSmallestValue, "0x1p-148", APFloat::opOK, APFloat::fcNormal },
2061 { PSmallestValue, PSmallestNormalized, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
2062 { PSmallestValue, MSmallestNormalized, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
2063 { MSmallestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2064 { MSmallestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2065 { MSmallestValue, PZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2066 { MSmallestValue, MZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
Stephen Canond3278282014-06-08 16:53:31 +00002067 { MSmallestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002068#if 0
2069// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00002070 { MSmallestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002071#endif
2072 { MSmallestValue, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2073 { MSmallestValue, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2074 { MSmallestValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2075 { MSmallestValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2076 { MSmallestValue, PSmallestValue, "-0x1p-148", APFloat::opOK, APFloat::fcNormal },
2077 { MSmallestValue, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2078 { MSmallestValue, PSmallestNormalized, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
2079 { MSmallestValue, MSmallestNormalized, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
2080 { PSmallestNormalized, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2081 { PSmallestNormalized, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2082 { PSmallestNormalized, PZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2083 { PSmallestNormalized, MZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
Stephen Canond3278282014-06-08 16:53:31 +00002084 { PSmallestNormalized, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002085#if 0
2086// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00002087 { PSmallestNormalized, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002088#endif
2089 { PSmallestNormalized, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2090 { PSmallestNormalized, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2091 { PSmallestNormalized, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2092 { PSmallestNormalized, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2093 { PSmallestNormalized, PSmallestValue, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
2094 { PSmallestNormalized, MSmallestValue, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
2095 { PSmallestNormalized, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2096 { PSmallestNormalized, MSmallestNormalized, "0x1p-125", APFloat::opOK, APFloat::fcNormal },
2097 { MSmallestNormalized, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2098 { MSmallestNormalized, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2099 { MSmallestNormalized, PZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2100 { MSmallestNormalized, MZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
Stephen Canond3278282014-06-08 16:53:31 +00002101 { MSmallestNormalized, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002102#if 0
2103// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00002104 { MSmallestNormalized, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002105#endif
2106 { MSmallestNormalized, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2107 { MSmallestNormalized, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2108 { MSmallestNormalized, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2109 { MSmallestNormalized, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2110 { MSmallestNormalized, PSmallestValue, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
2111 { MSmallestNormalized, MSmallestValue, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
2112 { MSmallestNormalized, PSmallestNormalized, "-0x1p-125", APFloat::opOK, APFloat::fcNormal },
2113 { MSmallestNormalized, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero }
2114 };
2115
2116 for (size_t i = 0; i < NumTests; ++i) {
2117 APFloat x(SpecialCaseTests[i].x);
2118 APFloat y(SpecialCaseTests[i].y);
2119 APFloat::opStatus status = x.subtract(y, APFloat::rmNearestTiesToEven);
2120
2121 APFloat result(APFloat::IEEEsingle, SpecialCaseTests[i].result);
2122
Michael Gottesman9368a532013-06-26 23:55:23 +00002123 EXPECT_TRUE(result.bitwiseIsEqual(x));
2124 EXPECT_TRUE((int)status == SpecialCaseTests[i].status);
2125 EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category);
2126 }
2127}
2128
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002129TEST(APFloatTest, multiply) {
2130 // Test Special Cases against each other and normal values.
2131
2132 // TODOS/NOTES:
2133 // 1. Since we perform only default exception handling all operations with
2134 // signaling NaNs should have a result that is a quiet NaN. Currently they
2135 // return sNaN.
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002136
2137 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false);
2138 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true);
2139 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false);
2140 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true);
2141 APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle, false);
2142 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle, false);
2143 APFloat PNormalValue = APFloat(APFloat::IEEEsingle, "0x1p+0");
2144 APFloat MNormalValue = APFloat(APFloat::IEEEsingle, "-0x1p+0");
2145 APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle, false);
2146 APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle, true);
2147 APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, false);
2148 APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, true);
2149 APFloat PSmallestNormalized =
2150 APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
2151 APFloat MSmallestNormalized =
2152 APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
2153
2154 const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact;
2155 const int UnderflowStatus = APFloat::opUnderflow | APFloat::opInexact;
2156
2157 const unsigned NumTests = 169;
2158 struct {
2159 APFloat x;
2160 APFloat y;
2161 const char *result;
2162 int status;
2163 int category;
2164 } SpecialCaseTests[NumTests] = {
2165 { PInf, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2166 { PInf, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2167 { PInf, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2168 { PInf, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2169 { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2170#if 0
2171// See Note 1.
2172 { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2173#endif
2174 { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2175 { PInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2176 { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2177 { PInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2178 { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2179 { PInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2180 { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
2181 { PInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
2182 { MInf, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2183 { MInf, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2184 { MInf, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2185 { MInf, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002186 { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002187#if 0
2188// See Note 1.
2189 { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2190#endif
2191 { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2192 { MInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2193 { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2194 { MInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2195 { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2196 { MInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2197 { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
2198 { MInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
2199 { PZero, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2200 { PZero, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2201 { PZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2202 { PZero, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2203 { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2204#if 0
2205// See Note 1.
2206 { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2207#endif
2208 { PZero, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2209 { PZero, MNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2210 { PZero, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2211 { PZero, MLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2212 { PZero, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2213 { PZero, MSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2214 { PZero, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2215 { PZero, MSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2216 { MZero, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2217 { MZero, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2218 { MZero, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2219 { MZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002220 { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002221#if 0
2222// See Note 1.
2223 { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2224#endif
2225 { MZero, PNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2226 { MZero, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2227 { MZero, PLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2228 { MZero, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2229 { MZero, PSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2230 { MZero, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2231 { MZero, PSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2232 { MZero, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2233 { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002234 { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002235 { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002236 { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002237 { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2238#if 0
2239// See Note 1.
2240 { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2241#endif
2242 { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002243 { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002244 { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002245 { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002246 { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002247 { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002248 { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002249 { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002250#if 0
2251// See Note 1.
2252 { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2253 { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2254 { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2255 { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2256 { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2257 { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2258 { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2259 { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2260 { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2261 { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2262 { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2263 { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2264 { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2265 { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2266#endif
2267 { PNormalValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2268 { PNormalValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2269 { PNormalValue, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2270 { PNormalValue, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2271 { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2272#if 0
2273// See Note 1.
2274 { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2275#endif
2276 { PNormalValue, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2277 { PNormalValue, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2278 { PNormalValue, PLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2279 { PNormalValue, MLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2280 { PNormalValue, PSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2281 { PNormalValue, MSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2282 { PNormalValue, PSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2283 { PNormalValue, MSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2284 { MNormalValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2285 { MNormalValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2286 { MNormalValue, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2287 { MNormalValue, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002288 { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002289#if 0
2290// See Note 1.
2291 { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2292#endif
2293 { MNormalValue, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2294 { MNormalValue, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2295 { MNormalValue, PLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2296 { MNormalValue, MLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2297 { MNormalValue, PSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2298 { MNormalValue, MSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2299 { MNormalValue, PSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2300 { MNormalValue, MSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2301 { PLargestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2302 { PLargestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2303 { PLargestValue, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2304 { PLargestValue, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2305 { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2306#if 0
2307// See Note 1.
2308 { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2309#endif
2310 { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2311 { PLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2312 { PLargestValue, PLargestValue, "inf", OverflowStatus, APFloat::fcInfinity },
2313 { PLargestValue, MLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
2314 { PLargestValue, PSmallestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2315 { PLargestValue, MSmallestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2316 { PLargestValue, PSmallestNormalized, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2317 { PLargestValue, MSmallestNormalized, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2318 { MLargestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2319 { MLargestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2320 { MLargestValue, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2321 { MLargestValue, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002322 { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002323#if 0
2324// See Note 1.
2325 { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2326#endif
2327 { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2328 { MLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2329 { MLargestValue, PLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
2330 { MLargestValue, MLargestValue, "inf", OverflowStatus, APFloat::fcInfinity },
2331 { MLargestValue, PSmallestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2332 { MLargestValue, MSmallestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2333 { MLargestValue, PSmallestNormalized, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2334 { MLargestValue, MSmallestNormalized, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2335 { PSmallestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2336 { PSmallestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2337 { PSmallestValue, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2338 { PSmallestValue, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2339 { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2340#if 0
2341// See Note 1.
2342 { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2343#endif
2344 { PSmallestValue, PNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2345 { PSmallestValue, MNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2346 { PSmallestValue, PLargestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2347 { PSmallestValue, MLargestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2348 { PSmallestValue, PSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2349 { PSmallestValue, MSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2350 { PSmallestValue, PSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2351 { PSmallestValue, MSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2352 { MSmallestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2353 { MSmallestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2354 { MSmallestValue, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2355 { MSmallestValue, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002356 { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002357#if 0
2358// See Note 1.
2359 { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2360#endif
2361 { MSmallestValue, PNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2362 { MSmallestValue, MNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2363 { MSmallestValue, PLargestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2364 { MSmallestValue, MLargestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2365 { MSmallestValue, PSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2366 { MSmallestValue, MSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2367 { MSmallestValue, PSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2368 { MSmallestValue, MSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2369 { PSmallestNormalized, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2370 { PSmallestNormalized, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2371 { PSmallestNormalized, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2372 { PSmallestNormalized, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2373 { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2374#if 0
2375// See Note 1.
2376 { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2377#endif
2378 { PSmallestNormalized, PNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2379 { PSmallestNormalized, MNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2380 { PSmallestNormalized, PLargestValue, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2381 { PSmallestNormalized, MLargestValue, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2382 { PSmallestNormalized, PSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2383 { PSmallestNormalized, MSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2384 { PSmallestNormalized, PSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2385 { PSmallestNormalized, MSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2386 { MSmallestNormalized, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2387 { MSmallestNormalized, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2388 { MSmallestNormalized, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2389 { MSmallestNormalized, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002390 { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002391#if 0
2392// See Note 1.
2393 { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2394#endif
2395 { MSmallestNormalized, PNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2396 { MSmallestNormalized, MNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2397 { MSmallestNormalized, PLargestValue, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2398 { MSmallestNormalized, MLargestValue, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2399 { MSmallestNormalized, PSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2400 { MSmallestNormalized, MSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2401 { MSmallestNormalized, PSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2402 { MSmallestNormalized, MSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero }
2403 };
2404
2405 for (size_t i = 0; i < NumTests; ++i) {
2406 APFloat x(SpecialCaseTests[i].x);
2407 APFloat y(SpecialCaseTests[i].y);
2408 APFloat::opStatus status = x.multiply(y, APFloat::rmNearestTiesToEven);
2409
2410 APFloat result(APFloat::IEEEsingle, SpecialCaseTests[i].result);
2411
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002412 EXPECT_TRUE(result.bitwiseIsEqual(x));
2413 EXPECT_TRUE((int)status == SpecialCaseTests[i].status);
2414 EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category);
2415 }
2416}
Michael Gottesman9368a532013-06-26 23:55:23 +00002417
Michael Gottesman3eacb582013-06-27 00:42:00 +00002418TEST(APFloatTest, divide) {
2419 // Test Special Cases against each other and normal values.
2420
2421 // TODOS/NOTES:
2422 // 1. Since we perform only default exception handling all operations with
2423 // signaling NaNs should have a result that is a quiet NaN. Currently they
2424 // return sNaN.
Michael Gottesman3eacb582013-06-27 00:42:00 +00002425
2426 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false);
2427 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true);
2428 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false);
2429 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true);
2430 APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle, false);
2431 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle, false);
2432 APFloat PNormalValue = APFloat(APFloat::IEEEsingle, "0x1p+0");
2433 APFloat MNormalValue = APFloat(APFloat::IEEEsingle, "-0x1p+0");
2434 APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle, false);
2435 APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle, true);
2436 APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, false);
2437 APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, true);
2438 APFloat PSmallestNormalized =
2439 APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
2440 APFloat MSmallestNormalized =
2441 APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
2442
2443 const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact;
2444 const int UnderflowStatus = APFloat::opUnderflow | APFloat::opInexact;
2445
2446 const unsigned NumTests = 169;
2447 struct {
2448 APFloat x;
2449 APFloat y;
2450 const char *result;
2451 int status;
2452 int category;
2453 } SpecialCaseTests[NumTests] = {
2454 { PInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2455 { PInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2456 { PInf, PZero, "inf", APFloat::opOK, APFloat::fcInfinity },
2457 { PInf, MZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
2458 { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2459#if 0
2460// See Note 1.
2461 { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2462#endif
2463 { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2464 { PInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2465 { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2466 { PInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2467 { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2468 { PInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2469 { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
2470 { PInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
2471 { MInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2472 { MInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2473 { MInf, PZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
2474 { MInf, MZero, "inf", APFloat::opOK, APFloat::fcInfinity },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002475 { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002476#if 0
2477// See Note 1.
2478 { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2479#endif
2480 { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2481 { MInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2482 { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2483 { MInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2484 { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2485 { MInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2486 { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
2487 { MInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
2488 { PZero, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2489 { PZero, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2490 { PZero, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2491 { PZero, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2492 { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2493#if 0
2494// See Note 1.
2495 { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2496#endif
2497 { PZero, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2498 { PZero, MNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2499 { PZero, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2500 { PZero, MLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2501 { PZero, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2502 { PZero, MSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2503 { PZero, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2504 { PZero, MSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2505 { MZero, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2506 { MZero, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2507 { MZero, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2508 { MZero, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002509 { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002510#if 0
2511// See Note 1.
2512 { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2513#endif
2514 { MZero, PNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2515 { MZero, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2516 { MZero, PLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2517 { MZero, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2518 { MZero, PSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2519 { MZero, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2520 { MZero, PSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2521 { MZero, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2522 { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002523 { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002524 { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002525 { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002526 { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2527#if 0
2528// See Note 1.
2529 { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2530#endif
2531 { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002532 { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002533 { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002534 { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002535 { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002536 { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002537 { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002538 { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002539#if 0
2540// See Note 1.
2541 { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2542 { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2543 { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2544 { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2545 { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2546 { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2547 { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2548 { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2549 { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2550 { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2551 { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2552 { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2553 { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2554 { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2555#endif
2556 { PNormalValue, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2557 { PNormalValue, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2558 { PNormalValue, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
2559 { PNormalValue, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2560 { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2561#if 0
2562// See Note 1.
2563 { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2564#endif
2565 { PNormalValue, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2566 { PNormalValue, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2567 { PNormalValue, PLargestValue, "0x1p-128", UnderflowStatus, APFloat::fcNormal },
2568 { PNormalValue, MLargestValue, "-0x1p-128", UnderflowStatus, APFloat::fcNormal },
2569 { PNormalValue, PSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity },
2570 { PNormalValue, MSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
2571 { PNormalValue, PSmallestNormalized, "0x1p+126", APFloat::opOK, APFloat::fcNormal },
2572 { PNormalValue, MSmallestNormalized, "-0x1p+126", APFloat::opOK, APFloat::fcNormal },
2573 { MNormalValue, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2574 { MNormalValue, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2575 { MNormalValue, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2576 { MNormalValue, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002577 { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002578#if 0
2579// See Note 1.
2580 { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2581#endif
2582 { MNormalValue, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2583 { MNormalValue, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2584 { MNormalValue, PLargestValue, "-0x1p-128", UnderflowStatus, APFloat::fcNormal },
2585 { MNormalValue, MLargestValue, "0x1p-128", UnderflowStatus, APFloat::fcNormal },
2586 { MNormalValue, PSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
2587 { MNormalValue, MSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity },
2588 { MNormalValue, PSmallestNormalized, "-0x1p+126", APFloat::opOK, APFloat::fcNormal },
2589 { MNormalValue, MSmallestNormalized, "0x1p+126", APFloat::opOK, APFloat::fcNormal },
2590 { PLargestValue, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2591 { PLargestValue, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2592 { PLargestValue, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
2593 { PLargestValue, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2594 { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2595#if 0
2596// See Note 1.
2597 { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2598#endif
2599 { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2600 { PLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2601 { PLargestValue, PLargestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2602 { PLargestValue, MLargestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2603 { PLargestValue, PSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity },
2604 { PLargestValue, MSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
2605 { PLargestValue, PSmallestNormalized, "inf", OverflowStatus, APFloat::fcInfinity },
2606 { PLargestValue, MSmallestNormalized, "-inf", OverflowStatus, APFloat::fcInfinity },
2607 { MLargestValue, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2608 { MLargestValue, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2609 { MLargestValue, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2610 { MLargestValue, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002611 { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002612#if 0
2613// See Note 1.
2614 { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2615#endif
2616 { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2617 { MLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2618 { MLargestValue, PLargestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2619 { MLargestValue, MLargestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2620 { MLargestValue, PSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
2621 { MLargestValue, MSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity },
2622 { MLargestValue, PSmallestNormalized, "-inf", OverflowStatus, APFloat::fcInfinity },
2623 { MLargestValue, MSmallestNormalized, "inf", OverflowStatus, APFloat::fcInfinity },
2624 { PSmallestValue, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2625 { PSmallestValue, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2626 { PSmallestValue, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
2627 { PSmallestValue, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2628 { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2629#if 0
2630// See Note 1.
2631 { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2632#endif
2633 { PSmallestValue, PNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2634 { PSmallestValue, MNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2635 { PSmallestValue, PLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2636 { PSmallestValue, MLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2637 { PSmallestValue, PSmallestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2638 { PSmallestValue, MSmallestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2639 { PSmallestValue, PSmallestNormalized, "0x1p-23", APFloat::opOK, APFloat::fcNormal },
2640 { PSmallestValue, MSmallestNormalized, "-0x1p-23", APFloat::opOK, APFloat::fcNormal },
2641 { MSmallestValue, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2642 { MSmallestValue, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2643 { MSmallestValue, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2644 { MSmallestValue, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002645 { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002646#if 0
2647// See Note 1.
2648 { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2649#endif
2650 { MSmallestValue, PNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2651 { MSmallestValue, MNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2652 { MSmallestValue, PLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2653 { MSmallestValue, MLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2654 { MSmallestValue, PSmallestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2655 { MSmallestValue, MSmallestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2656 { MSmallestValue, PSmallestNormalized, "-0x1p-23", APFloat::opOK, APFloat::fcNormal },
2657 { MSmallestValue, MSmallestNormalized, "0x1p-23", APFloat::opOK, APFloat::fcNormal },
2658 { PSmallestNormalized, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2659 { PSmallestNormalized, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2660 { PSmallestNormalized, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
2661 { PSmallestNormalized, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2662 { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2663#if 0
2664// See Note 1.
2665 { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2666#endif
2667 { PSmallestNormalized, PNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2668 { PSmallestNormalized, MNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2669 { PSmallestNormalized, PLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2670 { PSmallestNormalized, MLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2671 { PSmallestNormalized, PSmallestValue, "0x1p+23", APFloat::opOK, APFloat::fcNormal },
2672 { PSmallestNormalized, MSmallestValue, "-0x1p+23", APFloat::opOK, APFloat::fcNormal },
2673 { PSmallestNormalized, PSmallestNormalized, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2674 { PSmallestNormalized, MSmallestNormalized, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2675 { MSmallestNormalized, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2676 { MSmallestNormalized, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2677 { MSmallestNormalized, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2678 { MSmallestNormalized, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002679 { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002680#if 0
2681// See Note 1.
2682 { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2683#endif
2684 { MSmallestNormalized, PNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2685 { MSmallestNormalized, MNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2686 { MSmallestNormalized, PLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2687 { MSmallestNormalized, MLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2688 { MSmallestNormalized, PSmallestValue, "-0x1p+23", APFloat::opOK, APFloat::fcNormal },
2689 { MSmallestNormalized, MSmallestValue, "0x1p+23", APFloat::opOK, APFloat::fcNormal },
2690 { MSmallestNormalized, PSmallestNormalized, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2691 { MSmallestNormalized, MSmallestNormalized, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2692 };
2693
2694 for (size_t i = 0; i < NumTests; ++i) {
2695 APFloat x(SpecialCaseTests[i].x);
2696 APFloat y(SpecialCaseTests[i].y);
2697 APFloat::opStatus status = x.divide(y, APFloat::rmNearestTiesToEven);
2698
2699 APFloat result(APFloat::IEEEsingle, SpecialCaseTests[i].result);
2700
2701 EXPECT_TRUE(result.bitwiseIsEqual(x));
2702 EXPECT_TRUE((int)status == SpecialCaseTests[i].status);
2703 EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category);
2704 }
2705}
2706
Chandler Carruthdf782e42014-10-09 23:26:15 +00002707TEST(APFloatTest, operatorOverloads) {
2708 // This is mostly testing that these operator overloads compile.
2709 APFloat One = APFloat(APFloat::IEEEsingle, "0x1p+0");
2710 APFloat Two = APFloat(APFloat::IEEEsingle, "0x2p+0");
2711 EXPECT_TRUE(Two.bitwiseIsEqual(One + One));
2712 EXPECT_TRUE(One.bitwiseIsEqual(Two - One));
2713 EXPECT_TRUE(Two.bitwiseIsEqual(One * Two));
2714 EXPECT_TRUE(One.bitwiseIsEqual(Two / Two));
2715}
Chandler Carruth7468b062014-10-10 04:17:04 +00002716
Chandler Carruthafe56ae2014-10-10 08:27:22 +00002717TEST(APFloatTest, abs) {
2718 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false);
2719 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true);
2720 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false);
2721 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true);
2722 APFloat PQNaN = APFloat::getNaN(APFloat::IEEEsingle, false);
2723 APFloat MQNaN = APFloat::getNaN(APFloat::IEEEsingle, true);
2724 APFloat PSNaN = APFloat::getSNaN(APFloat::IEEEsingle, false);
2725 APFloat MSNaN = APFloat::getSNaN(APFloat::IEEEsingle, true);
2726 APFloat PNormalValue = APFloat(APFloat::IEEEsingle, "0x1p+0");
2727 APFloat MNormalValue = APFloat(APFloat::IEEEsingle, "-0x1p+0");
2728 APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle, false);
2729 APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle, true);
2730 APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, false);
2731 APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, true);
2732 APFloat PSmallestNormalized =
2733 APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
2734 APFloat MSmallestNormalized =
2735 APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
2736
2737 EXPECT_TRUE(PInf.bitwiseIsEqual(abs(PInf)));
2738 EXPECT_TRUE(PInf.bitwiseIsEqual(abs(MInf)));
2739 EXPECT_TRUE(PZero.bitwiseIsEqual(abs(PZero)));
2740 EXPECT_TRUE(PZero.bitwiseIsEqual(abs(MZero)));
2741 EXPECT_TRUE(PQNaN.bitwiseIsEqual(abs(PQNaN)));
2742 EXPECT_TRUE(PQNaN.bitwiseIsEqual(abs(MQNaN)));
2743 EXPECT_TRUE(PSNaN.bitwiseIsEqual(abs(PSNaN)));
2744 EXPECT_TRUE(PSNaN.bitwiseIsEqual(abs(MSNaN)));
2745 EXPECT_TRUE(PNormalValue.bitwiseIsEqual(abs(PNormalValue)));
2746 EXPECT_TRUE(PNormalValue.bitwiseIsEqual(abs(MNormalValue)));
2747 EXPECT_TRUE(PLargestValue.bitwiseIsEqual(abs(PLargestValue)));
2748 EXPECT_TRUE(PLargestValue.bitwiseIsEqual(abs(MLargestValue)));
2749 EXPECT_TRUE(PSmallestValue.bitwiseIsEqual(abs(PSmallestValue)));
2750 EXPECT_TRUE(PSmallestValue.bitwiseIsEqual(abs(MSmallestValue)));
2751 EXPECT_TRUE(PSmallestNormalized.bitwiseIsEqual(abs(PSmallestNormalized)));
2752 EXPECT_TRUE(PSmallestNormalized.bitwiseIsEqual(abs(MSmallestNormalized)));
2753}
2754
Chandler Carruthca067142014-10-10 05:14:12 +00002755TEST(APFloatTest, ilogb) {
2756 EXPECT_EQ(0, ilogb(APFloat(APFloat::IEEEsingle, "0x1p+0")));
2757 EXPECT_EQ(0, ilogb(APFloat(APFloat::IEEEsingle, "-0x1p+0")));
2758 EXPECT_EQ(42, ilogb(APFloat(APFloat::IEEEsingle, "0x1p+42")));
2759 EXPECT_EQ(-42, ilogb(APFloat(APFloat::IEEEsingle, "0x1p-42")));
Chandler Carruth7468b062014-10-10 04:17:04 +00002760
Chandler Carruthca067142014-10-10 05:14:12 +00002761 EXPECT_EQ(APFloat::IEK_Inf,
2762 ilogb(APFloat::getInf(APFloat::IEEEsingle, false)));
2763 EXPECT_EQ(APFloat::IEK_Inf,
2764 ilogb(APFloat::getInf(APFloat::IEEEsingle, true)));
2765 EXPECT_EQ(APFloat::IEK_Zero,
2766 ilogb(APFloat::getZero(APFloat::IEEEsingle, false)));
2767 EXPECT_EQ(APFloat::IEK_Zero,
2768 ilogb(APFloat::getZero(APFloat::IEEEsingle, true)));
2769 EXPECT_EQ(APFloat::IEK_NaN,
2770 ilogb(APFloat::getNaN(APFloat::IEEEsingle, false)));
2771 EXPECT_EQ(APFloat::IEK_NaN,
2772 ilogb(APFloat::getSNaN(APFloat::IEEEsingle, false)));
Chandler Carruth7468b062014-10-10 04:17:04 +00002773
Chandler Carruthca067142014-10-10 05:14:12 +00002774 EXPECT_EQ(127, ilogb(APFloat::getLargest(APFloat::IEEEsingle, false)));
2775 EXPECT_EQ(127, ilogb(APFloat::getLargest(APFloat::IEEEsingle, true)));
2776 EXPECT_EQ(-126, ilogb(APFloat::getSmallest(APFloat::IEEEsingle, false)));
2777 EXPECT_EQ(-126, ilogb(APFloat::getSmallest(APFloat::IEEEsingle, true)));
2778 EXPECT_EQ(-126,
2779 ilogb(APFloat::getSmallestNormalized(APFloat::IEEEsingle, false)));
2780 EXPECT_EQ(-126,
2781 ilogb(APFloat::getSmallestNormalized(APFloat::IEEEsingle, true)));
Chandler Carruth7468b062014-10-10 04:17:04 +00002782}
Chandler Carruthd9edd1e2014-10-10 04:54:30 +00002783
2784TEST(APFloatTest, scalbn) {
2785 EXPECT_TRUE(
2786 APFloat(APFloat::IEEEsingle, "0x1p+0")
2787 .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle, "0x1p+0"), 0)));
2788 EXPECT_TRUE(
2789 APFloat(APFloat::IEEEsingle, "0x1p+42")
2790 .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle, "0x1p+0"), 42)));
2791 EXPECT_TRUE(
2792 APFloat(APFloat::IEEEsingle, "0x1p-42")
2793 .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle, "0x1p+0"), -42)));
2794
2795 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false);
2796 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true);
2797 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false);
2798 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true);
2799 APFloat QPNaN = APFloat::getNaN(APFloat::IEEEsingle, false);
2800 APFloat QMNaN = APFloat::getNaN(APFloat::IEEEsingle, true);
2801 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle, false);
2802
2803 EXPECT_TRUE(PInf.bitwiseIsEqual(scalbn(PInf, 0)));
2804 EXPECT_TRUE(MInf.bitwiseIsEqual(scalbn(MInf, 0)));
2805 EXPECT_TRUE(PZero.bitwiseIsEqual(scalbn(PZero, 0)));
2806 EXPECT_TRUE(MZero.bitwiseIsEqual(scalbn(MZero, 0)));
2807 EXPECT_TRUE(QPNaN.bitwiseIsEqual(scalbn(QPNaN, 0)));
2808 EXPECT_TRUE(QMNaN.bitwiseIsEqual(scalbn(QMNaN, 0)));
2809 EXPECT_TRUE(SNaN.bitwiseIsEqual(scalbn(SNaN, 0)));
2810
2811 EXPECT_TRUE(
2812 PInf.bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle, "0x1p+0"), 128)));
2813 EXPECT_TRUE(MInf.bitwiseIsEqual(
2814 scalbn(APFloat(APFloat::IEEEsingle, "-0x1p+0"), 128)));
2815 EXPECT_TRUE(
2816 PInf.bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle, "0x1p+127"), 1)));
2817 EXPECT_TRUE(PZero.bitwiseIsEqual(
2818 scalbn(APFloat(APFloat::IEEEsingle, "0x1p+0"), -127)));
2819 EXPECT_TRUE(MZero.bitwiseIsEqual(
2820 scalbn(APFloat(APFloat::IEEEsingle, "-0x1p+0"), -127)));
2821 EXPECT_TRUE(PZero.bitwiseIsEqual(
2822 scalbn(APFloat(APFloat::IEEEsingle, "0x1p-126"), -1)));
2823 EXPECT_TRUE(PZero.bitwiseIsEqual(
2824 scalbn(APFloat(APFloat::IEEEsingle, "0x1p-126"), -1)));
2825}
Erick Tryzelaar19f63b22009-08-16 23:36:19 +00002826}