blob: 8a29b86b785c7ececff1d27c6176dc8432da65bd [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
Shuxin Yang4fb504f2013-01-07 18:59:35 +0000479TEST(APFloatTest, Denormal) {
480 APFloat::roundingMode rdmd = APFloat::rmNearestTiesToEven;
481
482 // Test single precision
483 {
484 const char *MinNormalStr = "1.17549435082228750797e-38";
485 EXPECT_FALSE(APFloat(APFloat::IEEEsingle, MinNormalStr).isDenormal());
486 EXPECT_FALSE(APFloat(APFloat::IEEEsingle, 0.0).isDenormal());
487
488 APFloat Val2(APFloat::IEEEsingle, 2.0e0);
489 APFloat T(APFloat::IEEEsingle, MinNormalStr);
490 T.divide(Val2, rdmd);
491 EXPECT_TRUE(T.isDenormal());
492 }
493
494 // Test double precision
495 {
496 const char *MinNormalStr = "2.22507385850720138309e-308";
497 EXPECT_FALSE(APFloat(APFloat::IEEEdouble, MinNormalStr).isDenormal());
498 EXPECT_FALSE(APFloat(APFloat::IEEEdouble, 0.0).isDenormal());
499
500 APFloat Val2(APFloat::IEEEdouble, 2.0e0);
501 APFloat T(APFloat::IEEEdouble, MinNormalStr);
502 T.divide(Val2, rdmd);
503 EXPECT_TRUE(T.isDenormal());
504 }
505
506 // Test Intel double-ext
507 {
508 const char *MinNormalStr = "3.36210314311209350626e-4932";
509 EXPECT_FALSE(APFloat(APFloat::x87DoubleExtended, MinNormalStr).isDenormal());
510 EXPECT_FALSE(APFloat(APFloat::x87DoubleExtended, 0.0).isDenormal());
511
512 APFloat Val2(APFloat::x87DoubleExtended, 2.0e0);
513 APFloat T(APFloat::x87DoubleExtended, MinNormalStr);
514 T.divide(Val2, rdmd);
515 EXPECT_TRUE(T.isDenormal());
516 }
517
518 // Test quadruple precision
519 {
520 const char *MinNormalStr = "3.36210314311209350626267781732175260e-4932";
521 EXPECT_FALSE(APFloat(APFloat::IEEEquad, MinNormalStr).isDenormal());
522 EXPECT_FALSE(APFloat(APFloat::IEEEquad, 0.0).isDenormal());
523
524 APFloat Val2(APFloat::IEEEquad, 2.0e0);
525 APFloat T(APFloat::IEEEquad, MinNormalStr);
526 T.divide(Val2, rdmd);
527 EXPECT_TRUE(T.isDenormal());
528 }
529}
530
Erick Tryzelaar19f63b22009-08-16 23:36:19 +0000531TEST(APFloatTest, Zero) {
Matt Beaumont-Gaya421ee12011-08-29 17:54:20 +0000532 EXPECT_EQ(0.0f, APFloat(0.0f).convertToFloat());
533 EXPECT_EQ(-0.0f, APFloat(-0.0f).convertToFloat());
534 EXPECT_TRUE(APFloat(-0.0f).isNegative());
Erick Tryzelaar19f63b22009-08-16 23:36:19 +0000535
Matt Beaumont-Gaya421ee12011-08-29 17:54:20 +0000536 EXPECT_EQ(0.0, APFloat(0.0).convertToDouble());
537 EXPECT_EQ(-0.0, APFloat(-0.0).convertToDouble());
538 EXPECT_TRUE(APFloat(-0.0).isNegative());
Erick Tryzelaar19f63b22009-08-16 23:36:19 +0000539}
540
Michael Gottesman228156c2013-07-01 23:54:08 +0000541TEST(APFloatTest, DecimalStringsWithoutNullTerminators) {
542 // Make sure that we can parse strings without null terminators.
543 // rdar://14323230.
544 APFloat Val(APFloat::IEEEdouble);
545 Val.convertFromString(StringRef("0.00", 3),
546 llvm::APFloat::rmNearestTiesToEven);
547 EXPECT_EQ(Val.convertToDouble(), 0.0);
548 Val.convertFromString(StringRef("0.01", 3),
549 llvm::APFloat::rmNearestTiesToEven);
550 EXPECT_EQ(Val.convertToDouble(), 0.0);
551 Val.convertFromString(StringRef("0.09", 3),
552 llvm::APFloat::rmNearestTiesToEven);
553 EXPECT_EQ(Val.convertToDouble(), 0.0);
554 Val.convertFromString(StringRef("0.095", 4),
555 llvm::APFloat::rmNearestTiesToEven);
556 EXPECT_EQ(Val.convertToDouble(), 0.09);
557 Val.convertFromString(StringRef("0.00e+3", 7),
558 llvm::APFloat::rmNearestTiesToEven);
559 EXPECT_EQ(Val.convertToDouble(), 0.00);
560 Val.convertFromString(StringRef("0e+3", 4),
561 llvm::APFloat::rmNearestTiesToEven);
562 EXPECT_EQ(Val.convertToDouble(), 0.00);
563
564}
565
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000566TEST(APFloatTest, fromZeroDecimalString) {
567 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0").convertToDouble());
568 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0").convertToDouble());
Erick Tryzelaarbc0d7492009-08-17 00:14:11 +0000569 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0").convertToDouble());
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000570
571 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.").convertToDouble());
572 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.").convertToDouble());
Erick Tryzelaarbc0d7492009-08-17 00:14:11 +0000573 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.").convertToDouble());
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000574
575 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, ".0").convertToDouble());
576 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+.0").convertToDouble());
Erick Tryzelaarbc0d7492009-08-17 00:14:11 +0000577 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-.0").convertToDouble());
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000578
579 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.0").convertToDouble());
580 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.0").convertToDouble());
Erick Tryzelaarbc0d7492009-08-17 00:14:11 +0000581 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.0").convertToDouble());
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000582
583 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "00000.").convertToDouble());
584 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+00000.").convertToDouble());
585 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-00000.").convertToDouble());
586
Erick Tryzelaarbc0d7492009-08-17 00:14:11 +0000587 EXPECT_EQ(0.0, APFloat(APFloat::IEEEdouble, ".00000").convertToDouble());
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000588 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+.00000").convertToDouble());
589 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-.00000").convertToDouble());
590
591 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0000.00000").convertToDouble());
592 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0000.00000").convertToDouble());
593 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0000.00000").convertToDouble());
594}
595
596TEST(APFloatTest, fromZeroDecimalSingleExponentString) {
597 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0e1").convertToDouble());
598 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e1").convertToDouble());
599 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e1").convertToDouble());
600
601 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0e+1").convertToDouble());
602 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e+1").convertToDouble());
603 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e+1").convertToDouble());
604
605 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0e-1").convertToDouble());
606 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e-1").convertToDouble());
607 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e-1").convertToDouble());
608
609
610 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.e1").convertToDouble());
611 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.e1").convertToDouble());
612 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.e1").convertToDouble());
613
614 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.e+1").convertToDouble());
615 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.e+1").convertToDouble());
616 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.e+1").convertToDouble());
617
618 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.e-1").convertToDouble());
619 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.e-1").convertToDouble());
620 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.e-1").convertToDouble());
621
622 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, ".0e1").convertToDouble());
623 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+.0e1").convertToDouble());
624 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-.0e1").convertToDouble());
625
626 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, ".0e+1").convertToDouble());
627 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+.0e+1").convertToDouble());
628 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-.0e+1").convertToDouble());
629
630 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, ".0e-1").convertToDouble());
631 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+.0e-1").convertToDouble());
632 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-.0e-1").convertToDouble());
633
634
635 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.0e1").convertToDouble());
636 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.0e1").convertToDouble());
637 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.0e1").convertToDouble());
638
639 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.0e+1").convertToDouble());
640 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.0e+1").convertToDouble());
641 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.0e+1").convertToDouble());
642
643 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0.0e-1").convertToDouble());
644 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.0e-1").convertToDouble());
645 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.0e-1").convertToDouble());
646
647
648 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "000.0000e1").convertToDouble());
649 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+000.0000e+1").convertToDouble());
650 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-000.0000e+1").convertToDouble());
651}
652
653TEST(APFloatTest, fromZeroDecimalLargeExponentString) {
654 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0e1234").convertToDouble());
655 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e1234").convertToDouble());
656 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e1234").convertToDouble());
657
658 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0e+1234").convertToDouble());
659 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e+1234").convertToDouble());
660 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e+1234").convertToDouble());
661
662 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0e-1234").convertToDouble());
663 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e-1234").convertToDouble());
664 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e-1234").convertToDouble());
665
Erick Tryzelaarbc0d7492009-08-17 00:14:11 +0000666 EXPECT_EQ(0.0, APFloat(APFloat::IEEEdouble, "000.0000e1234").convertToDouble());
667 EXPECT_EQ(0.0, APFloat(APFloat::IEEEdouble, "000.0000e-1234").convertToDouble());
Erick Tryzelaar19f63b22009-08-16 23:36:19 +0000668
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000669 EXPECT_EQ(0.0, APFloat(APFloat::IEEEdouble, StringRef("0e1234\02", 6)).convertToDouble());
670}
Erick Tryzelaar19f63b22009-08-16 23:36:19 +0000671
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000672TEST(APFloatTest, fromZeroHexadecimalString) {
673 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0p1").convertToDouble());
674 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0p1").convertToDouble());
675 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0p1").convertToDouble());
676
677 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0p+1").convertToDouble());
678 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0p+1").convertToDouble());
679 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0p+1").convertToDouble());
680
681 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0p-1").convertToDouble());
682 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0p-1").convertToDouble());
683 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0p-1").convertToDouble());
684
685
686 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.p1").convertToDouble());
687 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.p1").convertToDouble());
688 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.p1").convertToDouble());
689
690 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.p+1").convertToDouble());
691 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.p+1").convertToDouble());
692 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.p+1").convertToDouble());
693
694 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.p-1").convertToDouble());
695 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.p-1").convertToDouble());
696 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.p-1").convertToDouble());
697
698
699 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x.0p1").convertToDouble());
700 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x.0p1").convertToDouble());
701 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x.0p1").convertToDouble());
702
703 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x.0p+1").convertToDouble());
704 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x.0p+1").convertToDouble());
705 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x.0p+1").convertToDouble());
706
707 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x.0p-1").convertToDouble());
708 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x.0p-1").convertToDouble());
709 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x.0p-1").convertToDouble());
710
711
712 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.0p1").convertToDouble());
713 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.0p1").convertToDouble());
714 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.0p1").convertToDouble());
715
716 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.0p+1").convertToDouble());
717 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.0p+1").convertToDouble());
718 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.0p+1").convertToDouble());
719
720 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.0p-1").convertToDouble());
721 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.0p-1").convertToDouble());
722 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.0p-1").convertToDouble());
723
724
725 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x00000.p1").convertToDouble());
726 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0000.00000p1").convertToDouble());
727 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x.00000p1").convertToDouble());
728 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.p1").convertToDouble());
729 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0p1234").convertToDouble());
730 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0p1234").convertToDouble());
731 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x00000.p1234").convertToDouble());
732 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0000.00000p1234").convertToDouble());
733 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x.00000p1234").convertToDouble());
734 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.p1234").convertToDouble());
735}
736
737TEST(APFloatTest, fromDecimalString) {
738 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble, "1").convertToDouble());
739 EXPECT_EQ(2.0, APFloat(APFloat::IEEEdouble, "2.").convertToDouble());
740 EXPECT_EQ(0.5, APFloat(APFloat::IEEEdouble, ".5").convertToDouble());
741 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble, "1.0").convertToDouble());
742 EXPECT_EQ(-2.0, APFloat(APFloat::IEEEdouble, "-2").convertToDouble());
743 EXPECT_EQ(-4.0, APFloat(APFloat::IEEEdouble, "-4.").convertToDouble());
744 EXPECT_EQ(-0.5, APFloat(APFloat::IEEEdouble, "-.5").convertToDouble());
745 EXPECT_EQ(-1.5, APFloat(APFloat::IEEEdouble, "-1.5").convertToDouble());
746 EXPECT_EQ(1.25e12, APFloat(APFloat::IEEEdouble, "1.25e12").convertToDouble());
747 EXPECT_EQ(1.25e+12, APFloat(APFloat::IEEEdouble, "1.25e+12").convertToDouble());
748 EXPECT_EQ(1.25e-12, APFloat(APFloat::IEEEdouble, "1.25e-12").convertToDouble());
749 EXPECT_EQ(1024.0, APFloat(APFloat::IEEEdouble, "1024.").convertToDouble());
750 EXPECT_EQ(1024.05, APFloat(APFloat::IEEEdouble, "1024.05000").convertToDouble());
751 EXPECT_EQ(0.05, APFloat(APFloat::IEEEdouble, ".05000").convertToDouble());
752 EXPECT_EQ(2.0, APFloat(APFloat::IEEEdouble, "2.").convertToDouble());
753 EXPECT_EQ(2.0e2, APFloat(APFloat::IEEEdouble, "2.e2").convertToDouble());
754 EXPECT_EQ(2.0e+2, APFloat(APFloat::IEEEdouble, "2.e+2").convertToDouble());
755 EXPECT_EQ(2.0e-2, APFloat(APFloat::IEEEdouble, "2.e-2").convertToDouble());
756 EXPECT_EQ(2.05e2, APFloat(APFloat::IEEEdouble, "002.05000e2").convertToDouble());
757 EXPECT_EQ(2.05e+2, APFloat(APFloat::IEEEdouble, "002.05000e+2").convertToDouble());
758 EXPECT_EQ(2.05e-2, APFloat(APFloat::IEEEdouble, "002.05000e-2").convertToDouble());
759 EXPECT_EQ(2.05e12, APFloat(APFloat::IEEEdouble, "002.05000e12").convertToDouble());
760 EXPECT_EQ(2.05e+12, APFloat(APFloat::IEEEdouble, "002.05000e+12").convertToDouble());
761 EXPECT_EQ(2.05e-12, APFloat(APFloat::IEEEdouble, "002.05000e-12").convertToDouble());
John McCallb42cc682010-02-26 22:20:41 +0000762
763 // These are "carefully selected" to overflow the fast log-base
764 // calculations in APFloat.cpp
765 EXPECT_TRUE(APFloat(APFloat::IEEEdouble, "99e99999").isInfinity());
766 EXPECT_TRUE(APFloat(APFloat::IEEEdouble, "-99e99999").isInfinity());
767 EXPECT_TRUE(APFloat(APFloat::IEEEdouble, "1e-99999").isPosZero());
768 EXPECT_TRUE(APFloat(APFloat::IEEEdouble, "-1e-99999").isNegZero());
Eli Friedmand2eb07a2013-07-17 22:17:29 +0000769
770 EXPECT_EQ(2.71828, convertToDoubleFromString("2.71828"));
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000771}
772
773TEST(APFloatTest, fromHexadecimalString) {
774 EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble, "0x1p0").convertToDouble());
775 EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble, "+0x1p0").convertToDouble());
776 EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble, "-0x1p0").convertToDouble());
777
778 EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble, "0x1p+0").convertToDouble());
779 EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble, "+0x1p+0").convertToDouble());
780 EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble, "-0x1p+0").convertToDouble());
781
782 EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble, "0x1p-0").convertToDouble());
783 EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble, "+0x1p-0").convertToDouble());
784 EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble, "-0x1p-0").convertToDouble());
785
786
787 EXPECT_EQ( 2.0, APFloat(APFloat::IEEEdouble, "0x1p1").convertToDouble());
788 EXPECT_EQ(+2.0, APFloat(APFloat::IEEEdouble, "+0x1p1").convertToDouble());
789 EXPECT_EQ(-2.0, APFloat(APFloat::IEEEdouble, "-0x1p1").convertToDouble());
790
791 EXPECT_EQ( 2.0, APFloat(APFloat::IEEEdouble, "0x1p+1").convertToDouble());
792 EXPECT_EQ(+2.0, APFloat(APFloat::IEEEdouble, "+0x1p+1").convertToDouble());
793 EXPECT_EQ(-2.0, APFloat(APFloat::IEEEdouble, "-0x1p+1").convertToDouble());
794
795 EXPECT_EQ( 0.5, APFloat(APFloat::IEEEdouble, "0x1p-1").convertToDouble());
796 EXPECT_EQ(+0.5, APFloat(APFloat::IEEEdouble, "+0x1p-1").convertToDouble());
797 EXPECT_EQ(-0.5, APFloat(APFloat::IEEEdouble, "-0x1p-1").convertToDouble());
798
799
800 EXPECT_EQ( 3.0, APFloat(APFloat::IEEEdouble, "0x1.8p1").convertToDouble());
801 EXPECT_EQ(+3.0, APFloat(APFloat::IEEEdouble, "+0x1.8p1").convertToDouble());
802 EXPECT_EQ(-3.0, APFloat(APFloat::IEEEdouble, "-0x1.8p1").convertToDouble());
803
804 EXPECT_EQ( 3.0, APFloat(APFloat::IEEEdouble, "0x1.8p+1").convertToDouble());
805 EXPECT_EQ(+3.0, APFloat(APFloat::IEEEdouble, "+0x1.8p+1").convertToDouble());
806 EXPECT_EQ(-3.0, APFloat(APFloat::IEEEdouble, "-0x1.8p+1").convertToDouble());
807
808 EXPECT_EQ( 0.75, APFloat(APFloat::IEEEdouble, "0x1.8p-1").convertToDouble());
809 EXPECT_EQ(+0.75, APFloat(APFloat::IEEEdouble, "+0x1.8p-1").convertToDouble());
810 EXPECT_EQ(-0.75, APFloat(APFloat::IEEEdouble, "-0x1.8p-1").convertToDouble());
811
812
813 EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble, "0x1000.000p1").convertToDouble());
814 EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble, "+0x1000.000p1").convertToDouble());
815 EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble, "-0x1000.000p1").convertToDouble());
816
817 EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble, "0x1000.000p+1").convertToDouble());
818 EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble, "+0x1000.000p+1").convertToDouble());
819 EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble, "-0x1000.000p+1").convertToDouble());
820
821 EXPECT_EQ( 2048.0, APFloat(APFloat::IEEEdouble, "0x1000.000p-1").convertToDouble());
822 EXPECT_EQ(+2048.0, APFloat(APFloat::IEEEdouble, "+0x1000.000p-1").convertToDouble());
823 EXPECT_EQ(-2048.0, APFloat(APFloat::IEEEdouble, "-0x1000.000p-1").convertToDouble());
824
825
826 EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble, "0x1000p1").convertToDouble());
827 EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble, "+0x1000p1").convertToDouble());
828 EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble, "-0x1000p1").convertToDouble());
829
830 EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble, "0x1000p+1").convertToDouble());
831 EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble, "+0x1000p+1").convertToDouble());
832 EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble, "-0x1000p+1").convertToDouble());
833
834 EXPECT_EQ( 2048.0, APFloat(APFloat::IEEEdouble, "0x1000p-1").convertToDouble());
835 EXPECT_EQ(+2048.0, APFloat(APFloat::IEEEdouble, "+0x1000p-1").convertToDouble());
836 EXPECT_EQ(-2048.0, APFloat(APFloat::IEEEdouble, "-0x1000p-1").convertToDouble());
837
838
839 EXPECT_EQ( 16384.0, APFloat(APFloat::IEEEdouble, "0x10p10").convertToDouble());
840 EXPECT_EQ(+16384.0, APFloat(APFloat::IEEEdouble, "+0x10p10").convertToDouble());
841 EXPECT_EQ(-16384.0, APFloat(APFloat::IEEEdouble, "-0x10p10").convertToDouble());
842
843 EXPECT_EQ( 16384.0, APFloat(APFloat::IEEEdouble, "0x10p+10").convertToDouble());
844 EXPECT_EQ(+16384.0, APFloat(APFloat::IEEEdouble, "+0x10p+10").convertToDouble());
845 EXPECT_EQ(-16384.0, APFloat(APFloat::IEEEdouble, "-0x10p+10").convertToDouble());
846
847 EXPECT_EQ( 0.015625, APFloat(APFloat::IEEEdouble, "0x10p-10").convertToDouble());
848 EXPECT_EQ(+0.015625, APFloat(APFloat::IEEEdouble, "+0x10p-10").convertToDouble());
849 EXPECT_EQ(-0.015625, APFloat(APFloat::IEEEdouble, "-0x10p-10").convertToDouble());
850
851 EXPECT_EQ(1.0625, APFloat(APFloat::IEEEdouble, "0x1.1p0").convertToDouble());
852 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble, "0x1p0").convertToDouble());
Daniel Dunbarbc52e4f2009-09-03 22:57:02 +0000853
Eli Friedmand2eb07a2013-07-17 22:17:29 +0000854 EXPECT_EQ(convertToDoubleFromString("0x1p-150"),
855 convertToDoubleFromString("+0x800000000000000001.p-221"));
856 EXPECT_EQ(2251799813685248.5,
857 convertToDoubleFromString("0x80000000000004000000.010p-28"));
Erick Tryzelaar19f63b22009-08-16 23:36:19 +0000858}
859
John McCall29b5c282009-12-24 08:56:26 +0000860TEST(APFloatTest, toString) {
861 ASSERT_EQ("10", convertToString(10.0, 6, 3));
862 ASSERT_EQ("1.0E+1", convertToString(10.0, 6, 0));
863 ASSERT_EQ("10100", convertToString(1.01E+4, 5, 2));
864 ASSERT_EQ("1.01E+4", convertToString(1.01E+4, 4, 2));
865 ASSERT_EQ("1.01E+4", convertToString(1.01E+4, 5, 1));
866 ASSERT_EQ("0.0101", convertToString(1.01E-2, 5, 2));
John McCalldd5044a2009-12-24 23:18:09 +0000867 ASSERT_EQ("0.0101", convertToString(1.01E-2, 4, 2));
John McCall29b5c282009-12-24 08:56:26 +0000868 ASSERT_EQ("1.01E-2", convertToString(1.01E-2, 5, 1));
Eli Friedmane72f1322013-08-29 23:44:34 +0000869 ASSERT_EQ("0.78539816339744828", convertToString(0.78539816339744830961, 0, 3));
870 ASSERT_EQ("4.9406564584124654E-324", convertToString(4.9406564584124654e-324, 0, 3));
871 ASSERT_EQ("873.18340000000001", convertToString(873.1834, 0, 1));
872 ASSERT_EQ("8.7318340000000001E+2", convertToString(873.1834, 0, 0));
873 ASSERT_EQ("1.7976931348623157E+308", convertToString(1.7976931348623157E+308, 0, 0));
John McCall29b5c282009-12-24 08:56:26 +0000874}
875
Jeffrey Yasskin03b81a22011-07-15 07:04:56 +0000876TEST(APFloatTest, toInteger) {
877 bool isExact = false;
878 APSInt result(5, /*isUnsigned=*/true);
879
880 EXPECT_EQ(APFloat::opOK,
881 APFloat(APFloat::IEEEdouble, "10")
882 .convertToInteger(result, APFloat::rmTowardZero, &isExact));
883 EXPECT_TRUE(isExact);
884 EXPECT_EQ(APSInt(APInt(5, 10), true), result);
885
886 EXPECT_EQ(APFloat::opInvalidOp,
887 APFloat(APFloat::IEEEdouble, "-10")
888 .convertToInteger(result, APFloat::rmTowardZero, &isExact));
889 EXPECT_FALSE(isExact);
890 EXPECT_EQ(APSInt::getMinValue(5, true), result);
891
892 EXPECT_EQ(APFloat::opInvalidOp,
893 APFloat(APFloat::IEEEdouble, "32")
894 .convertToInteger(result, APFloat::rmTowardZero, &isExact));
895 EXPECT_FALSE(isExact);
896 EXPECT_EQ(APSInt::getMaxValue(5, true), result);
897
898 EXPECT_EQ(APFloat::opInexact,
899 APFloat(APFloat::IEEEdouble, "7.9")
900 .convertToInteger(result, APFloat::rmTowardZero, &isExact));
901 EXPECT_FALSE(isExact);
902 EXPECT_EQ(APSInt(APInt(5, 7), true), result);
903
904 result.setIsUnsigned(false);
905 EXPECT_EQ(APFloat::opOK,
906 APFloat(APFloat::IEEEdouble, "-10")
907 .convertToInteger(result, APFloat::rmTowardZero, &isExact));
908 EXPECT_TRUE(isExact);
909 EXPECT_EQ(APSInt(APInt(5, -10, true), false), result);
910
911 EXPECT_EQ(APFloat::opInvalidOp,
912 APFloat(APFloat::IEEEdouble, "-17")
913 .convertToInteger(result, APFloat::rmTowardZero, &isExact));
914 EXPECT_FALSE(isExact);
915 EXPECT_EQ(APSInt::getMinValue(5, false), result);
916
917 EXPECT_EQ(APFloat::opInvalidOp,
918 APFloat(APFloat::IEEEdouble, "16")
919 .convertToInteger(result, APFloat::rmTowardZero, &isExact));
920 EXPECT_FALSE(isExact);
921 EXPECT_EQ(APSInt::getMaxValue(5, false), result);
922}
923
John McCalldcb9a7a2010-02-28 02:51:25 +0000924static APInt nanbits(const fltSemantics &Sem,
925 bool SNaN, bool Negative, uint64_t fill) {
926 APInt apfill(64, fill);
927 if (SNaN)
928 return APFloat::getSNaN(Sem, Negative, &apfill).bitcastToAPInt();
929 else
930 return APFloat::getQNaN(Sem, Negative, &apfill).bitcastToAPInt();
931}
932
933TEST(APFloatTest, makeNaN) {
934 ASSERT_EQ(0x7fc00000, nanbits(APFloat::IEEEsingle, false, false, 0));
935 ASSERT_EQ(0xffc00000, nanbits(APFloat::IEEEsingle, false, true, 0));
936 ASSERT_EQ(0x7fc0ae72, nanbits(APFloat::IEEEsingle, false, false, 0xae72));
937 ASSERT_EQ(0x7fffae72, nanbits(APFloat::IEEEsingle, false, false, 0xffffae72));
938 ASSERT_EQ(0x7fa00000, nanbits(APFloat::IEEEsingle, true, false, 0));
939 ASSERT_EQ(0xffa00000, nanbits(APFloat::IEEEsingle, true, true, 0));
940 ASSERT_EQ(0x7f80ae72, nanbits(APFloat::IEEEsingle, true, false, 0xae72));
941 ASSERT_EQ(0x7fbfae72, nanbits(APFloat::IEEEsingle, true, false, 0xffffae72));
942
943 ASSERT_EQ(0x7ff8000000000000ULL, nanbits(APFloat::IEEEdouble, false, false, 0));
944 ASSERT_EQ(0xfff8000000000000ULL, nanbits(APFloat::IEEEdouble, false, true, 0));
945 ASSERT_EQ(0x7ff800000000ae72ULL, nanbits(APFloat::IEEEdouble, false, false, 0xae72));
946 ASSERT_EQ(0x7fffffffffffae72ULL, nanbits(APFloat::IEEEdouble, false, false, 0xffffffffffffae72ULL));
947 ASSERT_EQ(0x7ff4000000000000ULL, nanbits(APFloat::IEEEdouble, true, false, 0));
948 ASSERT_EQ(0xfff4000000000000ULL, nanbits(APFloat::IEEEdouble, true, true, 0));
949 ASSERT_EQ(0x7ff000000000ae72ULL, nanbits(APFloat::IEEEdouble, true, false, 0xae72));
950 ASSERT_EQ(0x7ff7ffffffffae72ULL, nanbits(APFloat::IEEEdouble, true, false, 0xffffffffffffae72ULL));
951}
952
Erick Tryzelaar927191f2009-08-17 00:55:33 +0000953#ifdef GTEST_HAS_DEATH_TEST
Jeffrey Yasskinb5cd0132010-03-17 01:18:45 +0000954#ifndef NDEBUG
Erick Tryzelaar927191f2009-08-17 00:55:33 +0000955TEST(APFloatTest, SemanticsDeath) {
956 EXPECT_DEATH(APFloat(APFloat::IEEEsingle, 0.0f).convertToDouble(), "Float semantics are not IEEEdouble");
957 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, 0.0 ).convertToFloat(), "Float semantics are not IEEEsingle");
958}
959
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000960TEST(APFloatTest, StringDecimalDeath) {
961 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ""), "Invalid string length");
962 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+"), "String has no digits");
963 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-"), "String has no digits");
Erick Tryzelaar19f63b22009-08-16 23:36:19 +0000964
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000965 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("\0", 1)), "Invalid character in significand");
966 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1\0", 2)), "Invalid character in significand");
967 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1\02", 3)), "Invalid character in significand");
968 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1\02e1", 5)), "Invalid character in significand");
Erick Tryzelaarbc0d7492009-08-17 00:14:11 +0000969 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1e\0", 3)), "Invalid character in exponent");
970 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1e1\0", 4)), "Invalid character in exponent");
971 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1e1\02", 5)), "Invalid character in exponent");
Erick Tryzelaar19f63b22009-08-16 23:36:19 +0000972
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000973 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.0f"), "Invalid character in significand");
Erick Tryzelaar19f63b22009-08-16 23:36:19 +0000974
Erick Tryzelaarda666c82009-08-20 23:30:43 +0000975 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".."), "String contains multiple dots");
976 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "..0"), "String contains multiple dots");
977 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.0.0"), "String contains multiple dots");
978}
979
980TEST(APFloatTest, StringDecimalSignificandDeath) {
981 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "."), "Significand has no digits");
982 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+."), "Significand has no digits");
983 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-."), "Significand has no digits");
984
985
986 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "e"), "Significand has no digits");
987 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+e"), "Significand has no digits");
988 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-e"), "Significand has no digits");
989
990 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "e1"), "Significand has no digits");
991 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+e1"), "Significand has no digits");
992 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-e1"), "Significand has no digits");
993
994 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".e1"), "Significand has no digits");
995 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+.e1"), "Significand has no digits");
996 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-.e1"), "Significand has no digits");
997
998
999 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".e"), "Significand has no digits");
1000 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+.e"), "Significand has no digits");
1001 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-.e"), "Significand has no digits");
1002}
1003
1004TEST(APFloatTest, StringDecimalExponentDeath) {
1005 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1e"), "Exponent has no digits");
1006 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+1e"), "Exponent has no digits");
1007 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-1e"), "Exponent has no digits");
1008
1009 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.e"), "Exponent has no digits");
1010 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+1.e"), "Exponent has no digits");
1011 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-1.e"), "Exponent has no digits");
1012
1013 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".1e"), "Exponent has no digits");
1014 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+.1e"), "Exponent has no digits");
1015 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-.1e"), "Exponent has no digits");
1016
1017 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.1e"), "Exponent has no digits");
1018 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+1.1e"), "Exponent has no digits");
1019 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-1.1e"), "Exponent has no digits");
1020
1021
1022 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1e+"), "Exponent has no digits");
1023 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1e-"), "Exponent has no digits");
1024
1025 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".1e"), "Exponent has no digits");
1026 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".1e+"), "Exponent has no digits");
1027 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".1e-"), "Exponent has no digits");
1028
1029 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.0e"), "Exponent has no digits");
1030 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.0e+"), "Exponent has no digits");
1031 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.0e-"), "Exponent has no digits");
1032}
1033
1034TEST(APFloatTest, StringHexadecimalDeath) {
1035 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x"), "Invalid string");
1036 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x"), "Invalid string");
1037 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x"), "Invalid string");
1038
1039 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x0"), "Hex strings require an exponent");
1040 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x0"), "Hex strings require an exponent");
1041 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x0"), "Hex strings require an exponent");
1042
1043 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x0."), "Hex strings require an exponent");
1044 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x0."), "Hex strings require an exponent");
1045 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x0."), "Hex strings require an exponent");
1046
1047 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x.0"), "Hex strings require an exponent");
1048 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.0"), "Hex strings require an exponent");
1049 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.0"), "Hex strings require an exponent");
1050
1051 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x0.0"), "Hex strings require an exponent");
1052 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x0.0"), "Hex strings require an exponent");
1053 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x0.0"), "Hex strings require an exponent");
1054
1055 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x\0", 3)), "Invalid character in significand");
1056 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1\0", 4)), "Invalid character in significand");
1057 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1\02", 5)), "Invalid character in significand");
1058 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1\02p1", 7)), "Invalid character in significand");
Erick Tryzelaarbc0d7492009-08-17 00:14:11 +00001059 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1p\0", 5)), "Invalid character in exponent");
1060 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1p1\0", 6)), "Invalid character in exponent");
1061 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1p1\02", 7)), "Invalid character in exponent");
Erick Tryzelaar19f63b22009-08-16 23:36:19 +00001062
Erick Tryzelaarbc0d7492009-08-17 00:14:11 +00001063 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1p0f"), "Invalid character in exponent");
Erick Tryzelaarda666c82009-08-20 23:30:43 +00001064
1065 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x..p1"), "String contains multiple dots");
1066 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x..0p1"), "String contains multiple dots");
1067 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.0.0p1"), "String contains multiple dots");
1068}
1069
1070TEST(APFloatTest, StringHexadecimalSignificandDeath) {
1071 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x."), "Significand has no digits");
1072 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x."), "Significand has no digits");
1073 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x."), "Significand has no digits");
1074
1075 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0xp"), "Significand has no digits");
1076 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0xp"), "Significand has no digits");
1077 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0xp"), "Significand has no digits");
1078
1079 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0xp+"), "Significand has no digits");
1080 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0xp+"), "Significand has no digits");
1081 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0xp+"), "Significand has no digits");
1082
1083 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0xp-"), "Significand has no digits");
1084 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0xp-"), "Significand has no digits");
1085 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0xp-"), "Significand has no digits");
1086
1087
1088 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x.p"), "Significand has no digits");
1089 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.p"), "Significand has no digits");
1090 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.p"), "Significand has no digits");
1091
1092 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x.p+"), "Significand has no digits");
1093 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.p+"), "Significand has no digits");
1094 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.p+"), "Significand has no digits");
1095
1096 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x.p-"), "Significand has no digits");
1097 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.p-"), "Significand has no digits");
1098 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.p-"), "Significand has no digits");
1099}
1100
1101TEST(APFloatTest, StringHexadecimalExponentDeath) {
1102 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1p"), "Exponent has no digits");
1103 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1p"), "Exponent has no digits");
1104 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1p"), "Exponent has no digits");
1105
1106 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1p+"), "Exponent has no digits");
1107 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1p+"), "Exponent has no digits");
1108 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1p+"), "Exponent has no digits");
1109
1110 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1p-"), "Exponent has no digits");
1111 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1p-"), "Exponent has no digits");
1112 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1p-"), "Exponent has no digits");
1113
1114
1115 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.p"), "Exponent has no digits");
1116 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.p"), "Exponent has no digits");
1117 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.p"), "Exponent has no digits");
1118
1119 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.p+"), "Exponent has no digits");
1120 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.p+"), "Exponent has no digits");
1121 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.p+"), "Exponent has no digits");
1122
1123 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.p-"), "Exponent has no digits");
1124 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.p-"), "Exponent has no digits");
1125 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.p-"), "Exponent has no digits");
1126
1127
1128 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x.1p"), "Exponent has no digits");
1129 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.1p"), "Exponent has no digits");
1130 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.1p"), "Exponent has no digits");
1131
1132 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x.1p+"), "Exponent has no digits");
1133 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.1p+"), "Exponent has no digits");
1134 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.1p+"), "Exponent has no digits");
1135
1136 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x.1p-"), "Exponent has no digits");
1137 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.1p-"), "Exponent has no digits");
1138 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.1p-"), "Exponent has no digits");
1139
1140
1141 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.1p"), "Exponent has no digits");
1142 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.1p"), "Exponent has no digits");
1143 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.1p"), "Exponent has no digits");
1144
1145 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.1p+"), "Exponent has no digits");
1146 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.1p+"), "Exponent has no digits");
1147 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.1p+"), "Exponent has no digits");
1148
1149 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.1p-"), "Exponent has no digits");
1150 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.1p-"), "Exponent has no digits");
1151 EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.1p-"), "Exponent has no digits");
Erick Tryzelaar19f63b22009-08-16 23:36:19 +00001152}
Erick Tryzelaar927191f2009-08-17 00:55:33 +00001153#endif
Jeffrey Yasskinb5cd0132010-03-17 01:18:45 +00001154#endif
Erick Tryzelaar19f63b22009-08-16 23:36:19 +00001155
Benjamin Kramer03fd6722011-03-30 15:42:27 +00001156TEST(APFloatTest, exactInverse) {
1157 APFloat inv(0.0f);
1158
1159 // Trivial operation.
1160 EXPECT_TRUE(APFloat(2.0).getExactInverse(&inv));
1161 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(0.5)));
1162 EXPECT_TRUE(APFloat(2.0f).getExactInverse(&inv));
1163 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(0.5f)));
Benjamin Kramer08be41a2012-11-08 13:58:10 +00001164 EXPECT_TRUE(APFloat(APFloat::IEEEquad, "2.0").getExactInverse(&inv));
1165 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(APFloat::IEEEquad, "0.5")));
1166 EXPECT_TRUE(APFloat(APFloat::PPCDoubleDouble, "2.0").getExactInverse(&inv));
1167 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(APFloat::PPCDoubleDouble, "0.5")));
1168 EXPECT_TRUE(APFloat(APFloat::x87DoubleExtended, "2.0").getExactInverse(&inv));
1169 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(APFloat::x87DoubleExtended, "0.5")));
Benjamin Kramer03fd6722011-03-30 15:42:27 +00001170
1171 // FLT_MIN
1172 EXPECT_TRUE(APFloat(1.17549435e-38f).getExactInverse(&inv));
1173 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(8.5070592e+37f)));
1174
Benjamin Krameraf0ed952011-03-30 17:02:54 +00001175 // Large float, inverse is a denormal.
Craig Topper66f09ad2014-06-08 22:29:17 +00001176 EXPECT_FALSE(APFloat(1.7014118e38f).getExactInverse(nullptr));
Benjamin Kramer03fd6722011-03-30 15:42:27 +00001177 // Zero
Craig Topper66f09ad2014-06-08 22:29:17 +00001178 EXPECT_FALSE(APFloat(0.0).getExactInverse(nullptr));
Benjamin Kramer03fd6722011-03-30 15:42:27 +00001179 // Denormalized float
Craig Topper66f09ad2014-06-08 22:29:17 +00001180 EXPECT_FALSE(APFloat(1.40129846e-45f).getExactInverse(nullptr));
Benjamin Kramer03fd6722011-03-30 15:42:27 +00001181}
1182
Owen Anderson1ff74b02012-08-15 05:39:46 +00001183TEST(APFloatTest, roundToIntegral) {
Owen Anderson352dfff2012-08-15 18:28:45 +00001184 APFloat T(-0.5), S(3.14), R(APFloat::getLargest(APFloat::IEEEdouble)), P(0.0);
Owen Anderson1ff74b02012-08-15 05:39:46 +00001185
1186 P = T;
1187 P.roundToIntegral(APFloat::rmTowardZero);
1188 EXPECT_EQ(-0.0, P.convertToDouble());
1189 P = T;
1190 P.roundToIntegral(APFloat::rmTowardNegative);
1191 EXPECT_EQ(-1.0, P.convertToDouble());
1192 P = T;
1193 P.roundToIntegral(APFloat::rmTowardPositive);
1194 EXPECT_EQ(-0.0, P.convertToDouble());
1195 P = T;
1196 P.roundToIntegral(APFloat::rmNearestTiesToEven);
1197 EXPECT_EQ(-0.0, P.convertToDouble());
1198
1199 P = S;
1200 P.roundToIntegral(APFloat::rmTowardZero);
1201 EXPECT_EQ(3.0, P.convertToDouble());
1202 P = S;
1203 P.roundToIntegral(APFloat::rmTowardNegative);
1204 EXPECT_EQ(3.0, P.convertToDouble());
1205 P = S;
1206 P.roundToIntegral(APFloat::rmTowardPositive);
1207 EXPECT_EQ(4.0, P.convertToDouble());
1208 P = S;
1209 P.roundToIntegral(APFloat::rmNearestTiesToEven);
1210 EXPECT_EQ(3.0, P.convertToDouble());
Owen Anderson352dfff2012-08-15 18:28:45 +00001211
1212 P = R;
1213 P.roundToIntegral(APFloat::rmTowardZero);
1214 EXPECT_EQ(R.convertToDouble(), P.convertToDouble());
1215 P = R;
1216 P.roundToIntegral(APFloat::rmTowardNegative);
1217 EXPECT_EQ(R.convertToDouble(), P.convertToDouble());
1218 P = R;
1219 P.roundToIntegral(APFloat::rmTowardPositive);
1220 EXPECT_EQ(R.convertToDouble(), P.convertToDouble());
1221 P = R;
1222 P.roundToIntegral(APFloat::rmNearestTiesToEven);
1223 EXPECT_EQ(R.convertToDouble(), P.convertToDouble());
Benjamin Kramerc38fab22012-09-26 14:06:58 +00001224
1225 P = APFloat::getZero(APFloat::IEEEdouble);
1226 P.roundToIntegral(APFloat::rmTowardZero);
1227 EXPECT_EQ(0.0, P.convertToDouble());
1228 P = APFloat::getZero(APFloat::IEEEdouble, true);
1229 P.roundToIntegral(APFloat::rmTowardZero);
1230 EXPECT_EQ(-0.0, P.convertToDouble());
1231 P = APFloat::getNaN(APFloat::IEEEdouble);
1232 P.roundToIntegral(APFloat::rmTowardZero);
1233 EXPECT_TRUE(IsNAN(P.convertToDouble()));
1234 P = APFloat::getInf(APFloat::IEEEdouble);
1235 P.roundToIntegral(APFloat::rmTowardZero);
1236 EXPECT_TRUE(IsInf(P.convertToDouble()) && P.convertToDouble() > 0.0);
1237 P = APFloat::getInf(APFloat::IEEEdouble, true);
1238 P.roundToIntegral(APFloat::rmTowardZero);
1239 EXPECT_TRUE(IsInf(P.convertToDouble()) && P.convertToDouble() < 0.0);
1240
Owen Anderson1ff74b02012-08-15 05:39:46 +00001241}
1242
Eli Friedmanc5322012011-10-12 21:51:36 +00001243TEST(APFloatTest, getLargest) {
Eli Friedman212e4472011-10-12 23:14:41 +00001244 EXPECT_EQ(3.402823466e+38f, APFloat::getLargest(APFloat::IEEEsingle).convertToFloat());
1245 EXPECT_EQ(1.7976931348623158e+308, APFloat::getLargest(APFloat::IEEEdouble).convertToDouble());
Eli Friedmanc5322012011-10-12 21:51:36 +00001246}
1247
Michael Gottesman63e6d212013-05-29 23:58:29 +00001248TEST(APFloatTest, getSmallest) {
1249 APFloat test = APFloat::getSmallest(APFloat::IEEEsingle, false);
1250 APFloat expected = APFloat(APFloat::IEEEsingle, "0x0.000002p-126");
Michael Gottesman5455d5b2013-05-30 00:18:44 +00001251 EXPECT_FALSE(test.isNegative());
Michael Gottesmanb5101ab2013-06-19 21:53:45 +00001252 EXPECT_TRUE(test.isFiniteNonZero());
Michael Gottesman5455d5b2013-05-30 00:18:44 +00001253 EXPECT_TRUE(test.isDenormal());
Michael Gottesman63e6d212013-05-29 23:58:29 +00001254 EXPECT_TRUE(test.bitwiseIsEqual(expected));
1255
1256 test = APFloat::getSmallest(APFloat::IEEEsingle, true);
1257 expected = APFloat(APFloat::IEEEsingle, "-0x0.000002p-126");
1258 EXPECT_TRUE(test.isNegative());
Michael Gottesmanb5101ab2013-06-19 21:53:45 +00001259 EXPECT_TRUE(test.isFiniteNonZero());
Michael Gottesman5455d5b2013-05-30 00:18:44 +00001260 EXPECT_TRUE(test.isDenormal());
Michael Gottesman63e6d212013-05-29 23:58:29 +00001261 EXPECT_TRUE(test.bitwiseIsEqual(expected));
1262
1263 test = APFloat::getSmallest(APFloat::IEEEquad, false);
1264 expected = APFloat(APFloat::IEEEquad, "0x0.0000000000000000000000000001p-16382");
Michael Gottesman5455d5b2013-05-30 00:18:44 +00001265 EXPECT_FALSE(test.isNegative());
Michael Gottesmanb5101ab2013-06-19 21:53:45 +00001266 EXPECT_TRUE(test.isFiniteNonZero());
Michael Gottesman5455d5b2013-05-30 00:18:44 +00001267 EXPECT_TRUE(test.isDenormal());
Michael Gottesman63e6d212013-05-29 23:58:29 +00001268 EXPECT_TRUE(test.bitwiseIsEqual(expected));
1269
1270 test = APFloat::getSmallest(APFloat::IEEEquad, true);
1271 expected = APFloat(APFloat::IEEEquad, "-0x0.0000000000000000000000000001p-16382");
1272 EXPECT_TRUE(test.isNegative());
Michael Gottesmanb5101ab2013-06-19 21:53:45 +00001273 EXPECT_TRUE(test.isFiniteNonZero());
Michael Gottesman5455d5b2013-05-30 00:18:44 +00001274 EXPECT_TRUE(test.isDenormal());
Michael Gottesmanf9899292013-06-24 09:58:09 +00001275 EXPECT_TRUE(test.bitwiseIsEqual(expected));
Michael Gottesman63e6d212013-05-29 23:58:29 +00001276}
1277
Michael Gottesman0db7c272013-05-30 00:18:47 +00001278TEST(APFloatTest, getSmallestNormalized) {
1279 APFloat test = APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
1280 APFloat expected = APFloat(APFloat::IEEEsingle, "0x1p-126");
1281 EXPECT_FALSE(test.isNegative());
Michael Gottesmanb5101ab2013-06-19 21:53:45 +00001282 EXPECT_TRUE(test.isFiniteNonZero());
Michael Gottesman0db7c272013-05-30 00:18:47 +00001283 EXPECT_FALSE(test.isDenormal());
1284 EXPECT_TRUE(test.bitwiseIsEqual(expected));
1285
1286 test = APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
1287 expected = APFloat(APFloat::IEEEsingle, "-0x1p-126");
1288 EXPECT_TRUE(test.isNegative());
Michael Gottesmanb5101ab2013-06-19 21:53:45 +00001289 EXPECT_TRUE(test.isFiniteNonZero());
Michael Gottesman0db7c272013-05-30 00:18:47 +00001290 EXPECT_FALSE(test.isDenormal());
1291 EXPECT_TRUE(test.bitwiseIsEqual(expected));
1292
1293 test = APFloat::getSmallestNormalized(APFloat::IEEEquad, false);
1294 expected = APFloat(APFloat::IEEEquad, "0x1p-16382");
1295 EXPECT_FALSE(test.isNegative());
Michael Gottesmanb5101ab2013-06-19 21:53:45 +00001296 EXPECT_TRUE(test.isFiniteNonZero());
Michael Gottesman0db7c272013-05-30 00:18:47 +00001297 EXPECT_FALSE(test.isDenormal());
1298 EXPECT_TRUE(test.bitwiseIsEqual(expected));
1299
1300 test = APFloat::getSmallestNormalized(APFloat::IEEEquad, true);
1301 expected = APFloat(APFloat::IEEEquad, "-0x1p-16382");
1302 EXPECT_TRUE(test.isNegative());
Michael Gottesmanb5101ab2013-06-19 21:53:45 +00001303 EXPECT_TRUE(test.isFiniteNonZero());
Michael Gottesman0db7c272013-05-30 00:18:47 +00001304 EXPECT_FALSE(test.isDenormal());
Michael Gottesmanf9899292013-06-24 09:58:09 +00001305 EXPECT_TRUE(test.bitwiseIsEqual(expected));
Michael Gottesman0db7c272013-05-30 00:18:47 +00001306}
1307
Michael Gottesmanfc718c92013-05-31 18:43:34 +00001308TEST(APFloatTest, getZero) {
1309 struct {
1310 const fltSemantics *semantics;
1311 const bool sign;
1312 const unsigned long long bitPattern[2];
1313 const unsigned bitPatternLength;
Benjamin Kramer0bb474f2013-06-01 22:29:41 +00001314 } const GetZeroTest[] = {
Michael Gottesmanfc718c92013-05-31 18:43:34 +00001315 { &APFloat::IEEEhalf, false, {0, 0}, 1},
Benjamin Kramer0bb474f2013-06-01 22:29:41 +00001316 { &APFloat::IEEEhalf, true, {0x8000ULL, 0}, 1},
Michael Gottesmanfc718c92013-05-31 18:43:34 +00001317 { &APFloat::IEEEsingle, false, {0, 0}, 1},
Benjamin Kramer0bb474f2013-06-01 22:29:41 +00001318 { &APFloat::IEEEsingle, true, {0x80000000ULL, 0}, 1},
Michael Gottesmanfc718c92013-05-31 18:43:34 +00001319 { &APFloat::IEEEdouble, false, {0, 0}, 1},
Benjamin Kramer0bb474f2013-06-01 22:29:41 +00001320 { &APFloat::IEEEdouble, true, {0x8000000000000000ULL, 0}, 1},
Michael Gottesmanfc718c92013-05-31 18:43:34 +00001321 { &APFloat::IEEEquad, false, {0, 0}, 2},
Benjamin Kramer0bb474f2013-06-01 22:29:41 +00001322 { &APFloat::IEEEquad, true, {0, 0x8000000000000000ULL}, 2},
Michael Gottesmanfc718c92013-05-31 18:43:34 +00001323 { &APFloat::PPCDoubleDouble, false, {0, 0}, 2},
Benjamin Kramer0bb474f2013-06-01 22:29:41 +00001324 { &APFloat::PPCDoubleDouble, true, {0x8000000000000000ULL, 0}, 2},
Michael Gottesmanfc718c92013-05-31 18:43:34 +00001325 { &APFloat::x87DoubleExtended, false, {0, 0}, 2},
Benjamin Kramer0bb474f2013-06-01 22:29:41 +00001326 { &APFloat::x87DoubleExtended, true, {0, 0x8000ULL}, 2},
Michael Gottesmanfc718c92013-05-31 18:43:34 +00001327 };
1328 const unsigned NumGetZeroTests = 12;
1329 for (unsigned i = 0; i < NumGetZeroTests; ++i) {
1330 APFloat test = APFloat::getZero(*GetZeroTest[i].semantics,
1331 GetZeroTest[i].sign);
1332 const char *pattern = GetZeroTest[i].sign? "-0x0p+0" : "0x0p+0";
1333 APFloat expected = APFloat(*GetZeroTest[i].semantics,
1334 pattern);
1335 EXPECT_TRUE(test.isZero());
1336 EXPECT_TRUE(GetZeroTest[i].sign? test.isNegative() : !test.isNegative());
1337 EXPECT_TRUE(test.bitwiseIsEqual(expected));
1338 for (unsigned j = 0, je = GetZeroTest[i].bitPatternLength; j < je; ++j) {
1339 EXPECT_EQ(GetZeroTest[i].bitPattern[j],
1340 test.bitcastToAPInt().getRawData()[j]);
1341 }
1342 }
1343}
1344
Chandler Carruthdf782e42014-10-09 23:26:15 +00001345TEST(APFloatTest, copySign) {
1346 EXPECT_TRUE(APFloat(-42.0).bitwiseIsEqual(
1347 APFloat::copySign(APFloat(42.0), APFloat(-1.0))));
1348 EXPECT_TRUE(APFloat(42.0).bitwiseIsEqual(
1349 APFloat::copySign(APFloat(-42.0), APFloat(1.0))));
1350 EXPECT_TRUE(APFloat(-42.0).bitwiseIsEqual(
1351 APFloat::copySign(APFloat(-42.0), APFloat(-1.0))));
1352 EXPECT_TRUE(APFloat(42.0).bitwiseIsEqual(
1353 APFloat::copySign(APFloat(42.0), APFloat(1.0))));
1354}
1355
Eli Friedmana84ad7d2011-11-26 03:38:02 +00001356TEST(APFloatTest, convert) {
1357 bool losesInfo;
1358 APFloat test(APFloat::IEEEdouble, "1.0");
1359 test.convert(APFloat::IEEEsingle, APFloat::rmNearestTiesToEven, &losesInfo);
1360 EXPECT_EQ(1.0f, test.convertToFloat());
1361 EXPECT_FALSE(losesInfo);
1362
1363 test = APFloat(APFloat::x87DoubleExtended, "0x1p-53");
1364 test.add(APFloat(APFloat::x87DoubleExtended, "1.0"), APFloat::rmNearestTiesToEven);
1365 test.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, &losesInfo);
1366 EXPECT_EQ(1.0, test.convertToDouble());
1367 EXPECT_TRUE(losesInfo);
1368
1369 test = APFloat(APFloat::IEEEquad, "0x1p-53");
1370 test.add(APFloat(APFloat::IEEEquad, "1.0"), APFloat::rmNearestTiesToEven);
1371 test.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, &losesInfo);
1372 EXPECT_EQ(1.0, test.convertToDouble());
1373 EXPECT_TRUE(losesInfo);
1374
1375 test = APFloat(APFloat::x87DoubleExtended, "0xf.fffffffp+28");
1376 test.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, &losesInfo);
1377 EXPECT_EQ(4294967295.0, test.convertToDouble());
1378 EXPECT_FALSE(losesInfo);
Benjamin Kramerb361adb2013-01-25 17:01:00 +00001379
1380 test = APFloat::getSNaN(APFloat::IEEEsingle);
1381 APFloat X87SNaN = APFloat::getSNaN(APFloat::x87DoubleExtended);
1382 test.convert(APFloat::x87DoubleExtended, APFloat::rmNearestTiesToEven,
1383 &losesInfo);
1384 EXPECT_TRUE(test.bitwiseIsEqual(X87SNaN));
1385 EXPECT_FALSE(losesInfo);
1386
1387 test = APFloat::getQNaN(APFloat::IEEEsingle);
1388 APFloat X87QNaN = APFloat::getQNaN(APFloat::x87DoubleExtended);
1389 test.convert(APFloat::x87DoubleExtended, APFloat::rmNearestTiesToEven,
1390 &losesInfo);
1391 EXPECT_TRUE(test.bitwiseIsEqual(X87QNaN));
1392 EXPECT_FALSE(losesInfo);
1393
1394 test = APFloat::getSNaN(APFloat::x87DoubleExtended);
1395 test.convert(APFloat::x87DoubleExtended, APFloat::rmNearestTiesToEven,
1396 &losesInfo);
1397 EXPECT_TRUE(test.bitwiseIsEqual(X87SNaN));
1398 EXPECT_FALSE(losesInfo);
1399
1400 test = APFloat::getQNaN(APFloat::x87DoubleExtended);
1401 test.convert(APFloat::x87DoubleExtended, APFloat::rmNearestTiesToEven,
1402 &losesInfo);
1403 EXPECT_TRUE(test.bitwiseIsEqual(X87QNaN));
1404 EXPECT_FALSE(losesInfo);
Eli Friedmana84ad7d2011-11-26 03:38:02 +00001405}
Ulrich Weigandd9f7e252012-10-29 18:09:01 +00001406
1407TEST(APFloatTest, PPCDoubleDouble) {
1408 APFloat test(APFloat::PPCDoubleDouble, "1.0");
1409 EXPECT_EQ(0x3ff0000000000000ull, test.bitcastToAPInt().getRawData()[0]);
1410 EXPECT_EQ(0x0000000000000000ull, test.bitcastToAPInt().getRawData()[1]);
1411
1412 test.divide(APFloat(APFloat::PPCDoubleDouble, "3.0"), APFloat::rmNearestTiesToEven);
1413 EXPECT_EQ(0x3fd5555555555555ull, test.bitcastToAPInt().getRawData()[0]);
1414 EXPECT_EQ(0x3c75555555555556ull, test.bitcastToAPInt().getRawData()[1]);
1415
1416 // LDBL_MAX
1417 test = APFloat(APFloat::PPCDoubleDouble, "1.79769313486231580793728971405301e+308");
1418 EXPECT_EQ(0x7fefffffffffffffull, test.bitcastToAPInt().getRawData()[0]);
1419 EXPECT_EQ(0x7c8ffffffffffffeull, test.bitcastToAPInt().getRawData()[1]);
1420
1421 // LDBL_MIN
1422 test = APFloat(APFloat::PPCDoubleDouble, "2.00416836000897277799610805135016e-292");
1423 EXPECT_EQ(0x0360000000000000ull, test.bitcastToAPInt().getRawData()[0]);
1424 EXPECT_EQ(0x0000000000000000ull, test.bitcastToAPInt().getRawData()[1]);
1425
1426 test = APFloat(APFloat::PPCDoubleDouble, "1.0");
1427 test.add(APFloat(APFloat::PPCDoubleDouble, "0x1p-105"), APFloat::rmNearestTiesToEven);
1428 EXPECT_EQ(0x3ff0000000000000ull, test.bitcastToAPInt().getRawData()[0]);
1429 EXPECT_EQ(0x3960000000000000ull, test.bitcastToAPInt().getRawData()[1]);
1430
1431 test = APFloat(APFloat::PPCDoubleDouble, "1.0");
1432 test.add(APFloat(APFloat::PPCDoubleDouble, "0x1p-106"), APFloat::rmNearestTiesToEven);
1433 EXPECT_EQ(0x3ff0000000000000ull, test.bitcastToAPInt().getRawData()[0]);
1434#if 0 // XFAIL
1435 // This is what we would expect with a true double-double implementation
1436 EXPECT_EQ(0x3950000000000000ull, test.bitcastToAPInt().getRawData()[1]);
1437#else
1438 // This is what we get with our 106-bit mantissa approximation
1439 EXPECT_EQ(0x0000000000000000ull, test.bitcastToAPInt().getRawData()[1]);
1440#endif
1441}
Michael Gottesman3acedb62013-06-04 03:46:25 +00001442
1443TEST(APFloatTest, isNegative) {
1444 APFloat t(APFloat::IEEEsingle, "0x1p+0");
1445 EXPECT_FALSE(t.isNegative());
1446 t = APFloat(APFloat::IEEEsingle, "-0x1p+0");
1447 EXPECT_TRUE(t.isNegative());
Michael Gottesmanf9899292013-06-24 09:58:09 +00001448
Michael Gottesman3acedb62013-06-04 03:46:25 +00001449 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, false).isNegative());
1450 EXPECT_TRUE(APFloat::getInf(APFloat::IEEEsingle, true).isNegative());
Michael Gottesmanf9899292013-06-24 09:58:09 +00001451
Michael Gottesman3acedb62013-06-04 03:46:25 +00001452 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, false).isNegative());
1453 EXPECT_TRUE(APFloat::getZero(APFloat::IEEEsingle, true).isNegative());
1454
1455 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, false).isNegative());
1456 EXPECT_TRUE(APFloat::getNaN(APFloat::IEEEsingle, true).isNegative());
1457
1458 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, false).isNegative());
1459 EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle, true).isNegative());
1460}
1461
Michael Gottesman120c92882013-06-20 18:34:38 +00001462TEST(APFloatTest, isNormal) {
Michael Gottesman3acedb62013-06-04 03:46:25 +00001463 APFloat t(APFloat::IEEEsingle, "0x1p+0");
Michael Gottesman120c92882013-06-20 18:34:38 +00001464 EXPECT_TRUE(t.isNormal());
Michael Gottesmanf9899292013-06-24 09:58:09 +00001465
Michael Gottesman120c92882013-06-20 18:34:38 +00001466 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, false).isNormal());
1467 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, false).isNormal());
1468 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, false).isNormal());
Michael Gottesmanf9899292013-06-24 09:58:09 +00001469 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, false).isNormal());
Michael Gottesman120c92882013-06-20 18:34:38 +00001470 EXPECT_FALSE(APFloat(APFloat::IEEEsingle, "0x1p-149").isNormal());
Michael Gottesman3acedb62013-06-04 03:46:25 +00001471}
1472
1473TEST(APFloatTest, isFinite) {
1474 APFloat t(APFloat::IEEEsingle, "0x1p+0");
Michael Gottesmanf9899292013-06-24 09:58:09 +00001475 EXPECT_TRUE(t.isFinite());
Michael Gottesman3acedb62013-06-04 03:46:25 +00001476 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, false).isFinite());
1477 EXPECT_TRUE(APFloat::getZero(APFloat::IEEEsingle, false).isFinite());
1478 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, false).isFinite());
Michael Gottesmanf9899292013-06-24 09:58:09 +00001479 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, false).isFinite());
1480 EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "0x1p-149").isFinite());
Michael Gottesman3acedb62013-06-04 03:46:25 +00001481}
1482
1483TEST(APFloatTest, isInfinity) {
1484 APFloat t(APFloat::IEEEsingle, "0x1p+0");
1485 EXPECT_FALSE(t.isInfinity());
1486 EXPECT_TRUE(APFloat::getInf(APFloat::IEEEsingle, false).isInfinity());
1487 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, false).isInfinity());
1488 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, false).isInfinity());
Michael Gottesmanf9899292013-06-24 09:58:09 +00001489 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, false).isInfinity());
Michael Gottesmand7c05612013-06-20 18:25:16 +00001490 EXPECT_FALSE(APFloat(APFloat::IEEEsingle, "0x1p-149").isInfinity());
Michael Gottesman3acedb62013-06-04 03:46:25 +00001491}
1492
1493TEST(APFloatTest, isNaN) {
1494 APFloat t(APFloat::IEEEsingle, "0x1p+0");
Michael Gottesmanf9899292013-06-24 09:58:09 +00001495 EXPECT_FALSE(t.isNaN());
Michael Gottesman3acedb62013-06-04 03:46:25 +00001496 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, false).isNaN());
1497 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, false).isNaN());
1498 EXPECT_TRUE(APFloat::getNaN(APFloat::IEEEsingle, false).isNaN());
Michael Gottesmanf9899292013-06-24 09:58:09 +00001499 EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle, false).isNaN());
Michael Gottesmand7c05612013-06-20 18:25:16 +00001500 EXPECT_FALSE(APFloat(APFloat::IEEEsingle, "0x1p-149").isNaN());
Michael Gottesman3acedb62013-06-04 03:46:25 +00001501}
1502
Michael Gottesmand95d4472013-06-19 21:00:17 +00001503TEST(APFloatTest, isFiniteNonZero) {
1504 // Test positive/negative normal value.
1505 EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "0x1p+0").isFiniteNonZero());
1506 EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "-0x1p+0").isFiniteNonZero());
1507
1508 // Test positive/negative denormal value.
1509 EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "0x1p-149").isFiniteNonZero());
1510 EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "-0x1p-149").isFiniteNonZero());
1511
1512 // Test +/- Infinity.
1513 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, false).isFiniteNonZero());
1514 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, true).isFiniteNonZero());
1515
1516 // Test +/- Zero.
1517 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, false).isFiniteNonZero());
1518 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, true).isFiniteNonZero());
1519
1520 // Test +/- qNaN. +/- dont mean anything with qNaN but paranoia can't hurt in
1521 // this instance.
1522 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, false).isFiniteNonZero());
1523 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, true).isFiniteNonZero());
1524
1525 // Test +/- sNaN. +/- dont mean anything with sNaN but paranoia can't hurt in
1526 // this instance.
Michael Gottesmanf9899292013-06-24 09:58:09 +00001527 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, false).isFiniteNonZero());
1528 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, true).isFiniteNonZero());
Michael Gottesmand95d4472013-06-19 21:00:17 +00001529}
1530
Michael Gottesmane45b1082013-06-24 09:58:07 +00001531TEST(APFloatTest, add) {
1532 // Test Special Cases against each other and normal values.
1533
1534 // TODOS/NOTES:
1535 // 1. Since we perform only default exception handling all operations with
1536 // signaling NaNs should have a result that is a quiet NaN. Currently they
1537 // return sNaN.
Michael Gottesmane45b1082013-06-24 09:58:07 +00001538
1539 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false);
1540 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true);
1541 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false);
1542 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true);
1543 APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle, false);
1544 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle, false);
1545 APFloat PNormalValue = APFloat(APFloat::IEEEsingle, "0x1p+0");
1546 APFloat MNormalValue = APFloat(APFloat::IEEEsingle, "-0x1p+0");
1547 APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle, false);
1548 APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle, true);
1549 APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, false);
1550 APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, true);
1551 APFloat PSmallestNormalized =
1552 APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
1553 APFloat MSmallestNormalized =
1554 APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
1555
1556 const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact;
1557
1558 const unsigned NumTests = 169;
1559 struct {
1560 APFloat x;
1561 APFloat y;
1562 const char *result;
1563 int status;
1564 int category;
1565 } SpecialCaseTests[NumTests] = {
1566 { PInf, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1567 { PInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1568 { PInf, PZero, "inf", APFloat::opOK, APFloat::fcInfinity },
1569 { PInf, MZero, "inf", APFloat::opOK, APFloat::fcInfinity },
1570 { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1571#if 0
1572 // See Note 1.
1573 { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1574#endif
1575 { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1576 { PInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1577 { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1578 { PInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1579 { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1580 { PInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1581 { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
1582 { PInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
1583 { MInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1584 { MInf, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1585 { MInf, PZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
1586 { MInf, MZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00001587 { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmane45b1082013-06-24 09:58:07 +00001588#if 0
1589 // See Note 1.
1590 { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1591#endif
1592 { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1593 { MInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1594 { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1595 { MInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1596 { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1597 { MInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1598 { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
1599 { MInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
1600 { PZero, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1601 { PZero, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1602 { PZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1603 { PZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1604 { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1605#if 0
1606 // See Note 1.
1607 { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1608#endif
1609 { PZero, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
1610 { PZero, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
1611 { PZero, PLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1612 { PZero, MLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1613 { PZero, PSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
1614 { PZero, MSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
1615 { PZero, PSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
1616 { PZero, MSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
1617 { MZero, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1618 { MZero, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1619 { MZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1620 { MZero, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00001621 { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmane45b1082013-06-24 09:58:07 +00001622#if 0
1623 // See Note 1.
1624 { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1625#endif
1626 { MZero, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
1627 { MZero, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
1628 { MZero, PLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1629 { MZero, MLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1630 { MZero, PSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
1631 { MZero, MSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
1632 { MZero, PSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
1633 { MZero, MSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
1634 { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN },
1635 { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN },
1636 { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN },
1637 { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN },
1638 { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1639#if 0
1640 // See Note 1.
1641 { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1642#endif
1643 { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
1644 { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
1645 { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
1646 { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
1647 { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
1648 { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
1649 { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
1650 { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
1651#if 0
1652 // See Note 1.
1653 { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1654 { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1655 { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1656 { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1657 { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1658 { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1659 { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1660 { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1661 { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1662 { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1663 { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1664 { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1665 { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1666 { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1667#endif
1668 { PNormalValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1669 { PNormalValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1670 { PNormalValue, PZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
1671 { PNormalValue, MZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
1672 { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1673#if 0
1674 // See Note 1.
1675 { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1676#endif
1677 { PNormalValue, PNormalValue, "0x1p+1", APFloat::opOK, APFloat::fcNormal },
1678 { PNormalValue, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1679 { PNormalValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1680 { PNormalValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1681 { PNormalValue, PSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1682 { PNormalValue, MSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1683 { PNormalValue, PSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1684 { PNormalValue, MSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1685 { MNormalValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1686 { MNormalValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1687 { MNormalValue, PZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
1688 { MNormalValue, MZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00001689 { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmane45b1082013-06-24 09:58:07 +00001690#if 0
1691 // See Note 1.
1692 { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1693#endif
1694 { MNormalValue, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1695 { MNormalValue, MNormalValue, "-0x1p+1", APFloat::opOK, APFloat::fcNormal },
1696 { MNormalValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1697 { MNormalValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1698 { MNormalValue, PSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1699 { MNormalValue, MSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1700 { MNormalValue, PSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1701 { MNormalValue, MSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1702 { PLargestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1703 { PLargestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1704 { PLargestValue, PZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1705 { PLargestValue, MZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1706 { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1707#if 0
1708 // See Note 1.
1709 { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1710#endif
1711 { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1712 { PLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1713 { PLargestValue, PLargestValue, "inf", OverflowStatus, APFloat::fcInfinity },
1714 { PLargestValue, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1715 { PLargestValue, PSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1716 { PLargestValue, MSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1717 { PLargestValue, PSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1718 { PLargestValue, MSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1719 { MLargestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1720 { MLargestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1721 { MLargestValue, PZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1722 { MLargestValue, MZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00001723 { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmane45b1082013-06-24 09:58:07 +00001724#if 0
1725 // See Note 1.
1726 { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1727#endif
1728 { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1729 { MLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1730 { MLargestValue, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1731 { MLargestValue, MLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
1732 { MLargestValue, PSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1733 { MLargestValue, MSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1734 { MLargestValue, PSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1735 { MLargestValue, MSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1736 { PSmallestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1737 { PSmallestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1738 { PSmallestValue, PZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
1739 { PSmallestValue, MZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
1740 { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1741#if 0
1742 // See Note 1.
1743 { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1744#endif
1745 { PSmallestValue, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1746 { PSmallestValue, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1747 { PSmallestValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1748 { PSmallestValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1749 { PSmallestValue, PSmallestValue, "0x1p-148", APFloat::opOK, APFloat::fcNormal },
1750 { PSmallestValue, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1751 { PSmallestValue, PSmallestNormalized, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
1752 { PSmallestValue, MSmallestNormalized, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
1753 { MSmallestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1754 { MSmallestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1755 { MSmallestValue, PZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
1756 { MSmallestValue, MZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00001757 { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmane45b1082013-06-24 09:58:07 +00001758#if 0
1759 // See Note 1.
1760 { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1761#endif
1762 { MSmallestValue, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1763 { MSmallestValue, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1764 { MSmallestValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1765 { MSmallestValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1766 { MSmallestValue, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1767 { MSmallestValue, MSmallestValue, "-0x1p-148", APFloat::opOK, APFloat::fcNormal },
1768 { MSmallestValue, PSmallestNormalized, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
1769 { MSmallestValue, MSmallestNormalized, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
1770 { PSmallestNormalized, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1771 { PSmallestNormalized, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1772 { PSmallestNormalized, PZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
1773 { PSmallestNormalized, MZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
1774 { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1775#if 0
1776// See Note 1.
1777 { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1778#endif
1779 { PSmallestNormalized, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1780 { PSmallestNormalized, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1781 { PSmallestNormalized, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1782 { PSmallestNormalized, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1783 { PSmallestNormalized, PSmallestValue, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
1784 { PSmallestNormalized, MSmallestValue, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
1785 { PSmallestNormalized, PSmallestNormalized, "0x1p-125", APFloat::opOK, APFloat::fcNormal },
1786 { PSmallestNormalized, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1787 { MSmallestNormalized, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1788 { MSmallestNormalized, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1789 { MSmallestNormalized, PZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
1790 { MSmallestNormalized, MZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00001791 { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmane45b1082013-06-24 09:58:07 +00001792#if 0
1793 // See Note 1.
1794 { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1795#endif
1796 { MSmallestNormalized, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1797 { MSmallestNormalized, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1798 { MSmallestNormalized, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1799 { MSmallestNormalized, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1800 { MSmallestNormalized, PSmallestValue, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
1801 { MSmallestNormalized, MSmallestValue, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
1802 { MSmallestNormalized, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1803 { MSmallestNormalized, MSmallestNormalized, "-0x1p-125", APFloat::opOK, APFloat::fcNormal }
1804 };
1805
1806 for (size_t i = 0; i < NumTests; ++i) {
1807 APFloat x(SpecialCaseTests[i].x);
1808 APFloat y(SpecialCaseTests[i].y);
1809 APFloat::opStatus status = x.add(y, APFloat::rmNearestTiesToEven);
1810
1811 APFloat result(APFloat::IEEEsingle, SpecialCaseTests[i].result);
1812
Michael Gottesmane45b1082013-06-24 09:58:07 +00001813 EXPECT_TRUE(result.bitwiseIsEqual(x));
1814 EXPECT_TRUE((int)status == SpecialCaseTests[i].status);
1815 EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category);
1816 }
1817}
1818
Michael Gottesman9368a532013-06-26 23:55:23 +00001819TEST(APFloatTest, subtract) {
1820 // Test Special Cases against each other and normal values.
1821
1822 // TODOS/NOTES:
1823 // 1. Since we perform only default exception handling all operations with
1824 // signaling NaNs should have a result that is a quiet NaN. Currently they
1825 // return sNaN.
Michael Gottesman9368a532013-06-26 23:55:23 +00001826
1827 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false);
1828 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true);
1829 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false);
1830 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true);
1831 APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle, false);
1832 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle, false);
1833 APFloat PNormalValue = APFloat(APFloat::IEEEsingle, "0x1p+0");
1834 APFloat MNormalValue = APFloat(APFloat::IEEEsingle, "-0x1p+0");
1835 APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle, false);
1836 APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle, true);
1837 APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, false);
1838 APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, true);
1839 APFloat PSmallestNormalized =
1840 APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
1841 APFloat MSmallestNormalized =
1842 APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
1843
1844 const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact;
1845
1846 const unsigned NumTests = 169;
1847 struct {
1848 APFloat x;
1849 APFloat y;
1850 const char *result;
1851 int status;
1852 int category;
1853 } SpecialCaseTests[NumTests] = {
1854 { PInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1855 { PInf, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1856 { PInf, PZero, "inf", APFloat::opOK, APFloat::fcInfinity },
1857 { PInf, MZero, "inf", APFloat::opOK, APFloat::fcInfinity },
Stephen Canond3278282014-06-08 16:53:31 +00001858 { PInf, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001859#if 0
1860// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00001861 { PInf, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001862#endif
1863 { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1864 { PInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1865 { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1866 { PInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1867 { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1868 { PInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1869 { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
1870 { PInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
1871 { MInf, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1872 { MInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1873 { MInf, PZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
1874 { MInf, MZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
Stephen Canond3278282014-06-08 16:53:31 +00001875 { MInf, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001876#if 0
1877// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00001878 { MInf, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001879#endif
1880 { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1881 { MInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1882 { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1883 { MInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1884 { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1885 { MInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1886 { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
1887 { MInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
1888 { PZero, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1889 { PZero, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1890 { PZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1891 { PZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
Stephen Canond3278282014-06-08 16:53:31 +00001892 { PZero, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001893#if 0
1894// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00001895 { PZero, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001896#endif
1897 { PZero, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
1898 { PZero, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
1899 { PZero, PLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1900 { PZero, MLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1901 { PZero, PSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
1902 { PZero, MSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
1903 { PZero, PSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
1904 { PZero, MSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
1905 { MZero, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1906 { MZero, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1907 { MZero, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
1908 { MZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
Stephen Canond3278282014-06-08 16:53:31 +00001909 { MZero, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001910#if 0
1911// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00001912 { MZero, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001913#endif
1914 { MZero, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
1915 { MZero, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
1916 { MZero, PLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1917 { MZero, MLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1918 { MZero, PSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
1919 { MZero, MSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
1920 { MZero, PSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
1921 { MZero, MSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
1922 { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN },
1923 { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN },
1924 { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN },
1925 { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN },
1926 { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1927#if 0
1928// See Note 1.
1929 { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1930#endif
1931 { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
1932 { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
1933 { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
1934 { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
1935 { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
1936 { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
1937 { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
1938 { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
1939#if 0
1940// See Note 1.
1941 { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1942 { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1943 { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1944 { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1945 { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1946 { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1947 { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1948 { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1949 { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1950 { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1951 { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1952 { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1953 { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1954 { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1955#endif
1956 { PNormalValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1957 { PNormalValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1958 { PNormalValue, PZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
1959 { PNormalValue, MZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
Stephen Canond3278282014-06-08 16:53:31 +00001960 { PNormalValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001961#if 0
1962// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00001963 { PNormalValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001964#endif
1965 { PNormalValue, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1966 { PNormalValue, MNormalValue, "0x1p+1", APFloat::opOK, APFloat::fcNormal },
1967 { PNormalValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1968 { PNormalValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1969 { PNormalValue, PSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1970 { PNormalValue, MSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1971 { PNormalValue, PSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1972 { PNormalValue, MSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1973 { MNormalValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1974 { MNormalValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1975 { MNormalValue, PZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
1976 { MNormalValue, MZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
Stephen Canond3278282014-06-08 16:53:31 +00001977 { MNormalValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001978#if 0
1979// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00001980 { MNormalValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001981#endif
1982 { MNormalValue, PNormalValue, "-0x1p+1", APFloat::opOK, APFloat::fcNormal },
1983 { MNormalValue, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1984 { MNormalValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1985 { MNormalValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1986 { MNormalValue, PSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1987 { MNormalValue, MSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1988 { MNormalValue, PSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1989 { MNormalValue, MSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1990 { PLargestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1991 { PLargestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1992 { PLargestValue, PZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1993 { PLargestValue, MZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
Stephen Canond3278282014-06-08 16:53:31 +00001994 { PLargestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001995#if 0
1996// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00001997 { PLargestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00001998#endif
1999 { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2000 { PLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2001 { PLargestValue, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2002 { PLargestValue, MLargestValue, "inf", OverflowStatus, APFloat::fcInfinity },
2003 { PLargestValue, PSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2004 { PLargestValue, MSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2005 { PLargestValue, PSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2006 { PLargestValue, MSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2007 { MLargestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2008 { MLargestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2009 { MLargestValue, PZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2010 { MLargestValue, MZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
Stephen Canond3278282014-06-08 16:53:31 +00002011 { MLargestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002012#if 0
2013// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00002014 { MLargestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002015#endif
2016 { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2017 { MLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2018 { MLargestValue, PLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
2019 { MLargestValue, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2020 { MLargestValue, PSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2021 { MLargestValue, MSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2022 { MLargestValue, PSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2023 { MLargestValue, MSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2024 { PSmallestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2025 { PSmallestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2026 { PSmallestValue, PZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2027 { PSmallestValue, MZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
Stephen Canond3278282014-06-08 16:53:31 +00002028 { PSmallestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002029#if 0
2030// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00002031 { PSmallestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002032#endif
2033 { PSmallestValue, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2034 { PSmallestValue, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2035 { PSmallestValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2036 { PSmallestValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2037 { PSmallestValue, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2038 { PSmallestValue, MSmallestValue, "0x1p-148", APFloat::opOK, APFloat::fcNormal },
2039 { PSmallestValue, PSmallestNormalized, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
2040 { PSmallestValue, MSmallestNormalized, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
2041 { MSmallestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2042 { MSmallestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2043 { MSmallestValue, PZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2044 { MSmallestValue, MZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
Stephen Canond3278282014-06-08 16:53:31 +00002045 { MSmallestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002046#if 0
2047// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00002048 { MSmallestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002049#endif
2050 { MSmallestValue, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2051 { MSmallestValue, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2052 { MSmallestValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2053 { MSmallestValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2054 { MSmallestValue, PSmallestValue, "-0x1p-148", APFloat::opOK, APFloat::fcNormal },
2055 { MSmallestValue, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2056 { MSmallestValue, PSmallestNormalized, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
2057 { MSmallestValue, MSmallestNormalized, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
2058 { PSmallestNormalized, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2059 { PSmallestNormalized, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2060 { PSmallestNormalized, PZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2061 { PSmallestNormalized, MZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
Stephen Canond3278282014-06-08 16:53:31 +00002062 { PSmallestNormalized, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002063#if 0
2064// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00002065 { PSmallestNormalized, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002066#endif
2067 { PSmallestNormalized, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2068 { PSmallestNormalized, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2069 { PSmallestNormalized, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2070 { PSmallestNormalized, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2071 { PSmallestNormalized, PSmallestValue, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
2072 { PSmallestNormalized, MSmallestValue, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
2073 { PSmallestNormalized, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2074 { PSmallestNormalized, MSmallestNormalized, "0x1p-125", APFloat::opOK, APFloat::fcNormal },
2075 { MSmallestNormalized, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2076 { MSmallestNormalized, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2077 { MSmallestNormalized, PZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2078 { MSmallestNormalized, MZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
Stephen Canond3278282014-06-08 16:53:31 +00002079 { MSmallestNormalized, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002080#if 0
2081// See Note 1.
Stephen Canond3278282014-06-08 16:53:31 +00002082 { MSmallestNormalized, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesman9368a532013-06-26 23:55:23 +00002083#endif
2084 { MSmallestNormalized, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2085 { MSmallestNormalized, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2086 { MSmallestNormalized, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2087 { MSmallestNormalized, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2088 { MSmallestNormalized, PSmallestValue, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
2089 { MSmallestNormalized, MSmallestValue, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
2090 { MSmallestNormalized, PSmallestNormalized, "-0x1p-125", APFloat::opOK, APFloat::fcNormal },
2091 { MSmallestNormalized, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero }
2092 };
2093
2094 for (size_t i = 0; i < NumTests; ++i) {
2095 APFloat x(SpecialCaseTests[i].x);
2096 APFloat y(SpecialCaseTests[i].y);
2097 APFloat::opStatus status = x.subtract(y, APFloat::rmNearestTiesToEven);
2098
2099 APFloat result(APFloat::IEEEsingle, SpecialCaseTests[i].result);
2100
Michael Gottesman9368a532013-06-26 23:55:23 +00002101 EXPECT_TRUE(result.bitwiseIsEqual(x));
2102 EXPECT_TRUE((int)status == SpecialCaseTests[i].status);
2103 EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category);
2104 }
2105}
2106
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002107TEST(APFloatTest, multiply) {
2108 // Test Special Cases against each other and normal values.
2109
2110 // TODOS/NOTES:
2111 // 1. Since we perform only default exception handling all operations with
2112 // signaling NaNs should have a result that is a quiet NaN. Currently they
2113 // return sNaN.
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002114
2115 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false);
2116 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true);
2117 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false);
2118 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true);
2119 APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle, false);
2120 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle, false);
2121 APFloat PNormalValue = APFloat(APFloat::IEEEsingle, "0x1p+0");
2122 APFloat MNormalValue = APFloat(APFloat::IEEEsingle, "-0x1p+0");
2123 APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle, false);
2124 APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle, true);
2125 APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, false);
2126 APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, true);
2127 APFloat PSmallestNormalized =
2128 APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
2129 APFloat MSmallestNormalized =
2130 APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
2131
2132 const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact;
2133 const int UnderflowStatus = APFloat::opUnderflow | APFloat::opInexact;
2134
2135 const unsigned NumTests = 169;
2136 struct {
2137 APFloat x;
2138 APFloat y;
2139 const char *result;
2140 int status;
2141 int category;
2142 } SpecialCaseTests[NumTests] = {
2143 { PInf, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2144 { PInf, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2145 { PInf, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2146 { PInf, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2147 { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2148#if 0
2149// See Note 1.
2150 { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2151#endif
2152 { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2153 { PInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2154 { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2155 { PInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2156 { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2157 { PInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2158 { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
2159 { PInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
2160 { MInf, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2161 { MInf, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2162 { MInf, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2163 { MInf, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002164 { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002165#if 0
2166// See Note 1.
2167 { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2168#endif
2169 { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2170 { MInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2171 { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2172 { MInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2173 { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2174 { MInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2175 { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
2176 { MInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
2177 { PZero, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2178 { PZero, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2179 { PZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2180 { PZero, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2181 { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2182#if 0
2183// See Note 1.
2184 { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2185#endif
2186 { PZero, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2187 { PZero, MNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2188 { PZero, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2189 { PZero, MLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2190 { PZero, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2191 { PZero, MSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2192 { PZero, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2193 { PZero, MSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2194 { MZero, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2195 { MZero, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2196 { MZero, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2197 { MZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002198 { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002199#if 0
2200// See Note 1.
2201 { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2202#endif
2203 { MZero, PNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2204 { MZero, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2205 { MZero, PLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2206 { MZero, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2207 { MZero, PSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2208 { MZero, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2209 { MZero, PSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2210 { MZero, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2211 { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002212 { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002213 { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002214 { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002215 { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2216#if 0
2217// See Note 1.
2218 { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2219#endif
2220 { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002221 { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002222 { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002223 { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002224 { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002225 { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002226 { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002227 { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002228#if 0
2229// See Note 1.
2230 { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2231 { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2232 { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2233 { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2234 { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2235 { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2236 { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2237 { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2238 { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2239 { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2240 { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2241 { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2242 { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2243 { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2244#endif
2245 { PNormalValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2246 { PNormalValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2247 { PNormalValue, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2248 { PNormalValue, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2249 { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2250#if 0
2251// See Note 1.
2252 { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2253#endif
2254 { PNormalValue, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2255 { PNormalValue, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2256 { PNormalValue, PLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2257 { PNormalValue, MLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2258 { PNormalValue, PSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2259 { PNormalValue, MSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2260 { PNormalValue, PSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2261 { PNormalValue, MSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2262 { MNormalValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2263 { MNormalValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2264 { MNormalValue, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2265 { MNormalValue, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002266 { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002267#if 0
2268// See Note 1.
2269 { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2270#endif
2271 { MNormalValue, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2272 { MNormalValue, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2273 { MNormalValue, PLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2274 { MNormalValue, MLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2275 { MNormalValue, PSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2276 { MNormalValue, MSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2277 { MNormalValue, PSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2278 { MNormalValue, MSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2279 { PLargestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2280 { PLargestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2281 { PLargestValue, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2282 { PLargestValue, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2283 { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2284#if 0
2285// See Note 1.
2286 { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2287#endif
2288 { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2289 { PLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2290 { PLargestValue, PLargestValue, "inf", OverflowStatus, APFloat::fcInfinity },
2291 { PLargestValue, MLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
2292 { PLargestValue, PSmallestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2293 { PLargestValue, MSmallestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2294 { PLargestValue, PSmallestNormalized, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2295 { PLargestValue, MSmallestNormalized, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2296 { MLargestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2297 { MLargestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2298 { MLargestValue, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2299 { MLargestValue, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002300 { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002301#if 0
2302// See Note 1.
2303 { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2304#endif
2305 { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2306 { MLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2307 { MLargestValue, PLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
2308 { MLargestValue, MLargestValue, "inf", OverflowStatus, APFloat::fcInfinity },
2309 { MLargestValue, PSmallestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2310 { MLargestValue, MSmallestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2311 { MLargestValue, PSmallestNormalized, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2312 { MLargestValue, MSmallestNormalized, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2313 { PSmallestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2314 { PSmallestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2315 { PSmallestValue, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2316 { PSmallestValue, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2317 { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2318#if 0
2319// See Note 1.
2320 { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2321#endif
2322 { PSmallestValue, PNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2323 { PSmallestValue, MNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2324 { PSmallestValue, PLargestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2325 { PSmallestValue, MLargestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2326 { PSmallestValue, PSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2327 { PSmallestValue, MSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2328 { PSmallestValue, PSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2329 { PSmallestValue, MSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2330 { MSmallestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2331 { MSmallestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2332 { MSmallestValue, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2333 { MSmallestValue, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002334 { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002335#if 0
2336// See Note 1.
2337 { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2338#endif
2339 { MSmallestValue, PNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2340 { MSmallestValue, MNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2341 { MSmallestValue, PLargestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2342 { MSmallestValue, MLargestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2343 { MSmallestValue, PSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2344 { MSmallestValue, MSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2345 { MSmallestValue, PSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2346 { MSmallestValue, MSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2347 { PSmallestNormalized, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2348 { PSmallestNormalized, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2349 { PSmallestNormalized, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2350 { PSmallestNormalized, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2351 { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2352#if 0
2353// See Note 1.
2354 { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2355#endif
2356 { PSmallestNormalized, PNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2357 { PSmallestNormalized, MNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2358 { PSmallestNormalized, PLargestValue, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2359 { PSmallestNormalized, MLargestValue, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2360 { PSmallestNormalized, PSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2361 { PSmallestNormalized, MSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2362 { PSmallestNormalized, PSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2363 { PSmallestNormalized, MSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2364 { MSmallestNormalized, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2365 { MSmallestNormalized, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2366 { MSmallestNormalized, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2367 { MSmallestNormalized, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002368 { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002369#if 0
2370// See Note 1.
2371 { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2372#endif
2373 { MSmallestNormalized, PNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2374 { MSmallestNormalized, MNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2375 { MSmallestNormalized, PLargestValue, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2376 { MSmallestNormalized, MLargestValue, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2377 { MSmallestNormalized, PSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2378 { MSmallestNormalized, MSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2379 { MSmallestNormalized, PSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2380 { MSmallestNormalized, MSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero }
2381 };
2382
2383 for (size_t i = 0; i < NumTests; ++i) {
2384 APFloat x(SpecialCaseTests[i].x);
2385 APFloat y(SpecialCaseTests[i].y);
2386 APFloat::opStatus status = x.multiply(y, APFloat::rmNearestTiesToEven);
2387
2388 APFloat result(APFloat::IEEEsingle, SpecialCaseTests[i].result);
2389
Michael Gottesman9debdfd2013-06-26 23:55:26 +00002390 EXPECT_TRUE(result.bitwiseIsEqual(x));
2391 EXPECT_TRUE((int)status == SpecialCaseTests[i].status);
2392 EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category);
2393 }
2394}
Michael Gottesman9368a532013-06-26 23:55:23 +00002395
Michael Gottesman3eacb582013-06-27 00:42:00 +00002396TEST(APFloatTest, divide) {
2397 // Test Special Cases against each other and normal values.
2398
2399 // TODOS/NOTES:
2400 // 1. Since we perform only default exception handling all operations with
2401 // signaling NaNs should have a result that is a quiet NaN. Currently they
2402 // return sNaN.
Michael Gottesman3eacb582013-06-27 00:42:00 +00002403
2404 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false);
2405 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true);
2406 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false);
2407 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true);
2408 APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle, false);
2409 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle, false);
2410 APFloat PNormalValue = APFloat(APFloat::IEEEsingle, "0x1p+0");
2411 APFloat MNormalValue = APFloat(APFloat::IEEEsingle, "-0x1p+0");
2412 APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle, false);
2413 APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle, true);
2414 APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, false);
2415 APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, true);
2416 APFloat PSmallestNormalized =
2417 APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
2418 APFloat MSmallestNormalized =
2419 APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
2420
2421 const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact;
2422 const int UnderflowStatus = APFloat::opUnderflow | APFloat::opInexact;
2423
2424 const unsigned NumTests = 169;
2425 struct {
2426 APFloat x;
2427 APFloat y;
2428 const char *result;
2429 int status;
2430 int category;
2431 } SpecialCaseTests[NumTests] = {
2432 { PInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2433 { PInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2434 { PInf, PZero, "inf", APFloat::opOK, APFloat::fcInfinity },
2435 { PInf, MZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
2436 { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2437#if 0
2438// See Note 1.
2439 { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2440#endif
2441 { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2442 { PInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2443 { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2444 { PInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2445 { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2446 { PInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2447 { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
2448 { PInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
2449 { MInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2450 { MInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2451 { MInf, PZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
2452 { MInf, MZero, "inf", APFloat::opOK, APFloat::fcInfinity },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002453 { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002454#if 0
2455// See Note 1.
2456 { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2457#endif
2458 { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2459 { MInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2460 { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2461 { MInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2462 { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2463 { MInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2464 { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
2465 { MInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
2466 { PZero, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2467 { PZero, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2468 { PZero, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2469 { PZero, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2470 { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2471#if 0
2472// See Note 1.
2473 { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2474#endif
2475 { PZero, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2476 { PZero, MNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2477 { PZero, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2478 { PZero, MLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2479 { PZero, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2480 { PZero, MSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2481 { PZero, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2482 { PZero, MSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2483 { MZero, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2484 { MZero, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2485 { MZero, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2486 { MZero, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002487 { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002488#if 0
2489// See Note 1.
2490 { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2491#endif
2492 { MZero, PNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2493 { MZero, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2494 { MZero, PLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2495 { MZero, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2496 { MZero, PSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2497 { MZero, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2498 { MZero, PSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2499 { MZero, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2500 { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002501 { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002502 { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002503 { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002504 { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2505#if 0
2506// See Note 1.
2507 { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2508#endif
2509 { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002510 { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002511 { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002512 { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002513 { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002514 { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002515 { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002516 { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002517#if 0
2518// See Note 1.
2519 { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2520 { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2521 { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2522 { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2523 { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2524 { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2525 { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2526 { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2527 { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2528 { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2529 { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2530 { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2531 { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2532 { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2533#endif
2534 { PNormalValue, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2535 { PNormalValue, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2536 { PNormalValue, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
2537 { PNormalValue, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2538 { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2539#if 0
2540// See Note 1.
2541 { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2542#endif
2543 { PNormalValue, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2544 { PNormalValue, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2545 { PNormalValue, PLargestValue, "0x1p-128", UnderflowStatus, APFloat::fcNormal },
2546 { PNormalValue, MLargestValue, "-0x1p-128", UnderflowStatus, APFloat::fcNormal },
2547 { PNormalValue, PSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity },
2548 { PNormalValue, MSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
2549 { PNormalValue, PSmallestNormalized, "0x1p+126", APFloat::opOK, APFloat::fcNormal },
2550 { PNormalValue, MSmallestNormalized, "-0x1p+126", APFloat::opOK, APFloat::fcNormal },
2551 { MNormalValue, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2552 { MNormalValue, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2553 { MNormalValue, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2554 { MNormalValue, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002555 { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002556#if 0
2557// See Note 1.
2558 { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2559#endif
2560 { MNormalValue, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2561 { MNormalValue, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2562 { MNormalValue, PLargestValue, "-0x1p-128", UnderflowStatus, APFloat::fcNormal },
2563 { MNormalValue, MLargestValue, "0x1p-128", UnderflowStatus, APFloat::fcNormal },
2564 { MNormalValue, PSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
2565 { MNormalValue, MSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity },
2566 { MNormalValue, PSmallestNormalized, "-0x1p+126", APFloat::opOK, APFloat::fcNormal },
2567 { MNormalValue, MSmallestNormalized, "0x1p+126", APFloat::opOK, APFloat::fcNormal },
2568 { PLargestValue, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2569 { PLargestValue, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2570 { PLargestValue, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
2571 { PLargestValue, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2572 { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2573#if 0
2574// See Note 1.
2575 { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2576#endif
2577 { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2578 { PLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2579 { PLargestValue, PLargestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2580 { PLargestValue, MLargestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2581 { PLargestValue, PSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity },
2582 { PLargestValue, MSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
2583 { PLargestValue, PSmallestNormalized, "inf", OverflowStatus, APFloat::fcInfinity },
2584 { PLargestValue, MSmallestNormalized, "-inf", OverflowStatus, APFloat::fcInfinity },
2585 { MLargestValue, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2586 { MLargestValue, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2587 { MLargestValue, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2588 { MLargestValue, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002589 { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002590#if 0
2591// See Note 1.
2592 { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2593#endif
2594 { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2595 { MLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2596 { MLargestValue, PLargestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2597 { MLargestValue, MLargestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2598 { MLargestValue, PSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
2599 { MLargestValue, MSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity },
2600 { MLargestValue, PSmallestNormalized, "-inf", OverflowStatus, APFloat::fcInfinity },
2601 { MLargestValue, MSmallestNormalized, "inf", OverflowStatus, APFloat::fcInfinity },
2602 { PSmallestValue, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2603 { PSmallestValue, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2604 { PSmallestValue, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
2605 { PSmallestValue, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2606 { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2607#if 0
2608// See Note 1.
2609 { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2610#endif
2611 { PSmallestValue, PNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2612 { PSmallestValue, MNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2613 { PSmallestValue, PLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2614 { PSmallestValue, MLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2615 { PSmallestValue, PSmallestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2616 { PSmallestValue, MSmallestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2617 { PSmallestValue, PSmallestNormalized, "0x1p-23", APFloat::opOK, APFloat::fcNormal },
2618 { PSmallestValue, MSmallestNormalized, "-0x1p-23", APFloat::opOK, APFloat::fcNormal },
2619 { MSmallestValue, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2620 { MSmallestValue, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2621 { MSmallestValue, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2622 { MSmallestValue, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002623 { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002624#if 0
2625// See Note 1.
2626 { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2627#endif
2628 { MSmallestValue, PNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2629 { MSmallestValue, MNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2630 { MSmallestValue, PLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2631 { MSmallestValue, MLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2632 { MSmallestValue, PSmallestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2633 { MSmallestValue, MSmallestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2634 { MSmallestValue, PSmallestNormalized, "-0x1p-23", APFloat::opOK, APFloat::fcNormal },
2635 { MSmallestValue, MSmallestNormalized, "0x1p-23", APFloat::opOK, APFloat::fcNormal },
2636 { PSmallestNormalized, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2637 { PSmallestNormalized, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2638 { PSmallestNormalized, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
2639 { PSmallestNormalized, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2640 { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2641#if 0
2642// See Note 1.
2643 { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2644#endif
2645 { PSmallestNormalized, PNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2646 { PSmallestNormalized, MNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2647 { PSmallestNormalized, PLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2648 { PSmallestNormalized, MLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2649 { PSmallestNormalized, PSmallestValue, "0x1p+23", APFloat::opOK, APFloat::fcNormal },
2650 { PSmallestNormalized, MSmallestValue, "-0x1p+23", APFloat::opOK, APFloat::fcNormal },
2651 { PSmallestNormalized, PSmallestNormalized, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2652 { PSmallestNormalized, MSmallestNormalized, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2653 { MSmallestNormalized, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2654 { MSmallestNormalized, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2655 { MSmallestNormalized, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2656 { MSmallestNormalized, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
Michael Gottesmanb0e688e2013-07-27 21:49:25 +00002657 { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
Michael Gottesman3eacb582013-06-27 00:42:00 +00002658#if 0
2659// See Note 1.
2660 { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2661#endif
2662 { MSmallestNormalized, PNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2663 { MSmallestNormalized, MNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2664 { MSmallestNormalized, PLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2665 { MSmallestNormalized, MLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2666 { MSmallestNormalized, PSmallestValue, "-0x1p+23", APFloat::opOK, APFloat::fcNormal },
2667 { MSmallestNormalized, MSmallestValue, "0x1p+23", APFloat::opOK, APFloat::fcNormal },
2668 { MSmallestNormalized, PSmallestNormalized, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2669 { MSmallestNormalized, MSmallestNormalized, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2670 };
2671
2672 for (size_t i = 0; i < NumTests; ++i) {
2673 APFloat x(SpecialCaseTests[i].x);
2674 APFloat y(SpecialCaseTests[i].y);
2675 APFloat::opStatus status = x.divide(y, APFloat::rmNearestTiesToEven);
2676
2677 APFloat result(APFloat::IEEEsingle, SpecialCaseTests[i].result);
2678
2679 EXPECT_TRUE(result.bitwiseIsEqual(x));
2680 EXPECT_TRUE((int)status == SpecialCaseTests[i].status);
2681 EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category);
2682 }
2683}
2684
Chandler Carruthdf782e42014-10-09 23:26:15 +00002685TEST(APFloatTest, operatorOverloads) {
2686 // This is mostly testing that these operator overloads compile.
2687 APFloat One = APFloat(APFloat::IEEEsingle, "0x1p+0");
2688 APFloat Two = APFloat(APFloat::IEEEsingle, "0x2p+0");
2689 EXPECT_TRUE(Two.bitwiseIsEqual(One + One));
2690 EXPECT_TRUE(One.bitwiseIsEqual(Two - One));
2691 EXPECT_TRUE(Two.bitwiseIsEqual(One * Two));
2692 EXPECT_TRUE(One.bitwiseIsEqual(Two / Two));
2693}
Chandler Carruth7468b062014-10-10 04:17:04 +00002694
Chandler Carruthca067142014-10-10 05:14:12 +00002695TEST(APFloatTest, ilogb) {
2696 EXPECT_EQ(0, ilogb(APFloat(APFloat::IEEEsingle, "0x1p+0")));
2697 EXPECT_EQ(0, ilogb(APFloat(APFloat::IEEEsingle, "-0x1p+0")));
2698 EXPECT_EQ(42, ilogb(APFloat(APFloat::IEEEsingle, "0x1p+42")));
2699 EXPECT_EQ(-42, ilogb(APFloat(APFloat::IEEEsingle, "0x1p-42")));
Chandler Carruth7468b062014-10-10 04:17:04 +00002700
Chandler Carruthca067142014-10-10 05:14:12 +00002701 EXPECT_EQ(APFloat::IEK_Inf,
2702 ilogb(APFloat::getInf(APFloat::IEEEsingle, false)));
2703 EXPECT_EQ(APFloat::IEK_Inf,
2704 ilogb(APFloat::getInf(APFloat::IEEEsingle, true)));
2705 EXPECT_EQ(APFloat::IEK_Zero,
2706 ilogb(APFloat::getZero(APFloat::IEEEsingle, false)));
2707 EXPECT_EQ(APFloat::IEK_Zero,
2708 ilogb(APFloat::getZero(APFloat::IEEEsingle, true)));
2709 EXPECT_EQ(APFloat::IEK_NaN,
2710 ilogb(APFloat::getNaN(APFloat::IEEEsingle, false)));
2711 EXPECT_EQ(APFloat::IEK_NaN,
2712 ilogb(APFloat::getSNaN(APFloat::IEEEsingle, false)));
Chandler Carruth7468b062014-10-10 04:17:04 +00002713
Chandler Carruthca067142014-10-10 05:14:12 +00002714 EXPECT_EQ(127, ilogb(APFloat::getLargest(APFloat::IEEEsingle, false)));
2715 EXPECT_EQ(127, ilogb(APFloat::getLargest(APFloat::IEEEsingle, true)));
2716 EXPECT_EQ(-126, ilogb(APFloat::getSmallest(APFloat::IEEEsingle, false)));
2717 EXPECT_EQ(-126, ilogb(APFloat::getSmallest(APFloat::IEEEsingle, true)));
2718 EXPECT_EQ(-126,
2719 ilogb(APFloat::getSmallestNormalized(APFloat::IEEEsingle, false)));
2720 EXPECT_EQ(-126,
2721 ilogb(APFloat::getSmallestNormalized(APFloat::IEEEsingle, true)));
Chandler Carruth7468b062014-10-10 04:17:04 +00002722}
Chandler Carruthd9edd1e2014-10-10 04:54:30 +00002723
2724TEST(APFloatTest, scalbn) {
2725 EXPECT_TRUE(
2726 APFloat(APFloat::IEEEsingle, "0x1p+0")
2727 .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle, "0x1p+0"), 0)));
2728 EXPECT_TRUE(
2729 APFloat(APFloat::IEEEsingle, "0x1p+42")
2730 .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle, "0x1p+0"), 42)));
2731 EXPECT_TRUE(
2732 APFloat(APFloat::IEEEsingle, "0x1p-42")
2733 .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle, "0x1p+0"), -42)));
2734
2735 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false);
2736 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true);
2737 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false);
2738 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true);
2739 APFloat QPNaN = APFloat::getNaN(APFloat::IEEEsingle, false);
2740 APFloat QMNaN = APFloat::getNaN(APFloat::IEEEsingle, true);
2741 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle, false);
2742
2743 EXPECT_TRUE(PInf.bitwiseIsEqual(scalbn(PInf, 0)));
2744 EXPECT_TRUE(MInf.bitwiseIsEqual(scalbn(MInf, 0)));
2745 EXPECT_TRUE(PZero.bitwiseIsEqual(scalbn(PZero, 0)));
2746 EXPECT_TRUE(MZero.bitwiseIsEqual(scalbn(MZero, 0)));
2747 EXPECT_TRUE(QPNaN.bitwiseIsEqual(scalbn(QPNaN, 0)));
2748 EXPECT_TRUE(QMNaN.bitwiseIsEqual(scalbn(QMNaN, 0)));
2749 EXPECT_TRUE(SNaN.bitwiseIsEqual(scalbn(SNaN, 0)));
2750
2751 EXPECT_TRUE(
2752 PInf.bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle, "0x1p+0"), 128)));
2753 EXPECT_TRUE(MInf.bitwiseIsEqual(
2754 scalbn(APFloat(APFloat::IEEEsingle, "-0x1p+0"), 128)));
2755 EXPECT_TRUE(
2756 PInf.bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle, "0x1p+127"), 1)));
2757 EXPECT_TRUE(PZero.bitwiseIsEqual(
2758 scalbn(APFloat(APFloat::IEEEsingle, "0x1p+0"), -127)));
2759 EXPECT_TRUE(MZero.bitwiseIsEqual(
2760 scalbn(APFloat(APFloat::IEEEsingle, "-0x1p+0"), -127)));
2761 EXPECT_TRUE(PZero.bitwiseIsEqual(
2762 scalbn(APFloat(APFloat::IEEEsingle, "0x1p-126"), -1)));
2763 EXPECT_TRUE(PZero.bitwiseIsEqual(
2764 scalbn(APFloat(APFloat::IEEEsingle, "0x1p-126"), -1)));
2765}
Erick Tryzelaar19f63b22009-08-16 23:36:19 +00002766}