1 //===- llvm/unittest/ADT/APFloat.cpp - APFloat unit tests ---------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "llvm/ADT/APFloat.h"
10 #include "llvm/ADT/APSInt.h"
11 #include "llvm/ADT/Hashing.h"
12 #include "llvm/ADT/SmallString.h"
13 #include "llvm/ADT/SmallVector.h"
14 #include "llvm/ADT/StringExtras.h"
15 #include "llvm/Support/Error.h"
16 #include "llvm/Support/FormatVariadic.h"
17 #include "gtest/gtest.h"
25 static std::string
convertToErrorFromString(StringRef Str
) {
28 F
.convertFromString(Str
, llvm::APFloat::rmNearestTiesToEven
);
29 EXPECT_TRUE(!StatusOrErr
);
30 return toString(StatusOrErr
.takeError());
33 static double convertToDoubleFromString(StringRef Str
) {
36 F
.convertFromString(Str
, llvm::APFloat::rmNearestTiesToEven
);
37 EXPECT_FALSE(!StatusOrErr
);
38 consumeError(StatusOrErr
.takeError());
39 return F
.convertToDouble();
42 static std::string
convertToString(double d
, unsigned Prec
, unsigned Pad
,
44 llvm::SmallVector
<char, 100> Buffer
;
46 F
.toString(Buffer
, Prec
, Pad
, Tr
);
47 return std::string(Buffer
.data(), Buffer
.size());
52 TEST(APFloatTest
, isSignaling
) {
53 // We test qNaN, -qNaN, +sNaN, -sNaN with and without payloads. *NOTE* The
54 // positive/negative distinction is included only since the getQNaN/getSNaN
55 // API provides the option.
56 APInt payload
= APInt::getOneBitSet(4, 2);
57 APFloat QNan
= APFloat::getQNaN(APFloat::IEEEsingle(), false);
58 EXPECT_FALSE(QNan
.isSignaling());
59 EXPECT_EQ(fcQNan
, QNan
.classify());
61 EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle(), true).isSignaling());
62 EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle(), false, &payload
).isSignaling());
63 EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle(), true, &payload
).isSignaling());
65 APFloat SNan
= APFloat::getSNaN(APFloat::IEEEsingle(), false);
66 EXPECT_TRUE(SNan
.isSignaling());
67 EXPECT_EQ(fcSNan
, SNan
.classify());
69 EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle(), true).isSignaling());
70 EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle(), false, &payload
).isSignaling());
71 EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle(), true, &payload
).isSignaling());
74 TEST(APFloatTest
, next
) {
76 APFloat
test(APFloat::IEEEquad(), APFloat::uninitialized
);
77 APFloat
expected(APFloat::IEEEquad(), APFloat::uninitialized
);
79 // 1. Test Special Cases Values.
81 // Test all special values for nextUp and nextDown perscribed by IEEE-754R
94 // nextUp(+inf) = +inf.
95 test
= APFloat::getInf(APFloat::IEEEquad(), false);
96 expected
= APFloat::getInf(APFloat::IEEEquad(), false);
97 EXPECT_EQ(test
.next(false), APFloat::opOK
);
98 EXPECT_TRUE(test
.isInfinity());
99 EXPECT_TRUE(!test
.isNegative());
100 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
102 // nextDown(+inf) = -nextUp(-inf) = -(-getLargest()) = getLargest()
103 test
= APFloat::getInf(APFloat::IEEEquad(), false);
104 expected
= APFloat::getLargest(APFloat::IEEEquad(), false);
105 EXPECT_EQ(test
.next(true), APFloat::opOK
);
106 EXPECT_TRUE(!test
.isNegative());
107 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
109 // nextUp(-inf) = -getLargest()
110 test
= APFloat::getInf(APFloat::IEEEquad(), true);
111 expected
= APFloat::getLargest(APFloat::IEEEquad(), true);
112 EXPECT_EQ(test
.next(false), APFloat::opOK
);
113 EXPECT_TRUE(test
.isNegative());
114 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
116 // nextDown(-inf) = -nextUp(+inf) = -(+inf) = -inf.
117 test
= APFloat::getInf(APFloat::IEEEquad(), true);
118 expected
= APFloat::getInf(APFloat::IEEEquad(), true);
119 EXPECT_EQ(test
.next(true), APFloat::opOK
);
120 EXPECT_TRUE(test
.isInfinity() && test
.isNegative());
121 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
123 // nextUp(getLargest()) = +inf
124 test
= APFloat::getLargest(APFloat::IEEEquad(), false);
125 expected
= APFloat::getInf(APFloat::IEEEquad(), false);
126 EXPECT_EQ(test
.next(false), APFloat::opOK
);
127 EXPECT_TRUE(test
.isInfinity() && !test
.isNegative());
128 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
130 // nextDown(getLargest()) = -nextUp(-getLargest())
131 // = -(-getLargest() + inc)
132 // = getLargest() - inc.
133 test
= APFloat::getLargest(APFloat::IEEEquad(), false);
134 expected
= APFloat(APFloat::IEEEquad(),
135 "0x1.fffffffffffffffffffffffffffep+16383");
136 EXPECT_EQ(test
.next(true), APFloat::opOK
);
137 EXPECT_TRUE(!test
.isInfinity() && !test
.isNegative());
138 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
140 // nextUp(-getLargest()) = -getLargest() + inc.
141 test
= APFloat::getLargest(APFloat::IEEEquad(), true);
142 expected
= APFloat(APFloat::IEEEquad(),
143 "-0x1.fffffffffffffffffffffffffffep+16383");
144 EXPECT_EQ(test
.next(false), APFloat::opOK
);
145 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
147 // nextDown(-getLargest()) = -nextUp(getLargest()) = -(inf) = -inf.
148 test
= APFloat::getLargest(APFloat::IEEEquad(), true);
149 expected
= APFloat::getInf(APFloat::IEEEquad(), true);
150 EXPECT_EQ(test
.next(true), APFloat::opOK
);
151 EXPECT_TRUE(test
.isInfinity() && test
.isNegative());
152 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
154 // nextUp(getSmallest()) = getSmallest() + inc.
155 test
= APFloat(APFloat::IEEEquad(), "0x0.0000000000000000000000000001p-16382");
156 expected
= APFloat(APFloat::IEEEquad(),
157 "0x0.0000000000000000000000000002p-16382");
158 EXPECT_EQ(test
.next(false), APFloat::opOK
);
159 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
161 // nextDown(getSmallest()) = -nextUp(-getSmallest()) = -(-0) = +0.
162 test
= APFloat(APFloat::IEEEquad(), "0x0.0000000000000000000000000001p-16382");
163 expected
= APFloat::getZero(APFloat::IEEEquad(), false);
164 EXPECT_EQ(test
.next(true), APFloat::opOK
);
165 EXPECT_TRUE(test
.isPosZero());
166 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
168 // nextUp(-getSmallest()) = -0.
169 test
= APFloat(APFloat::IEEEquad(), "-0x0.0000000000000000000000000001p-16382");
170 expected
= APFloat::getZero(APFloat::IEEEquad(), true);
171 EXPECT_EQ(test
.next(false), APFloat::opOK
);
172 EXPECT_TRUE(test
.isNegZero());
173 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
175 // nextDown(-getSmallest()) = -nextUp(getSmallest()) = -getSmallest() - inc.
176 test
= APFloat(APFloat::IEEEquad(), "-0x0.0000000000000000000000000001p-16382");
177 expected
= APFloat(APFloat::IEEEquad(),
178 "-0x0.0000000000000000000000000002p-16382");
179 EXPECT_EQ(test
.next(true), APFloat::opOK
);
180 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
182 // nextUp(qNaN) = qNaN
183 test
= APFloat::getQNaN(APFloat::IEEEquad(), false);
184 expected
= APFloat::getQNaN(APFloat::IEEEquad(), false);
185 EXPECT_EQ(test
.next(false), APFloat::opOK
);
186 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
188 // nextDown(qNaN) = qNaN
189 test
= APFloat::getQNaN(APFloat::IEEEquad(), false);
190 expected
= APFloat::getQNaN(APFloat::IEEEquad(), false);
191 EXPECT_EQ(test
.next(true), APFloat::opOK
);
192 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
194 // nextUp(sNaN) = qNaN
195 test
= APFloat::getSNaN(APFloat::IEEEquad(), false);
196 expected
= APFloat::getQNaN(APFloat::IEEEquad(), false);
197 EXPECT_EQ(test
.next(false), APFloat::opInvalidOp
);
198 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
200 // nextDown(sNaN) = qNaN
201 test
= APFloat::getSNaN(APFloat::IEEEquad(), false);
202 expected
= APFloat::getQNaN(APFloat::IEEEquad(), false);
203 EXPECT_EQ(test
.next(true), APFloat::opInvalidOp
);
204 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
206 // nextUp(+0) = +getSmallest()
207 test
= APFloat::getZero(APFloat::IEEEquad(), false);
208 expected
= APFloat::getSmallest(APFloat::IEEEquad(), false);
209 EXPECT_EQ(test
.next(false), APFloat::opOK
);
210 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
212 // nextDown(+0) = -nextUp(-0) = -getSmallest()
213 test
= APFloat::getZero(APFloat::IEEEquad(), false);
214 expected
= APFloat::getSmallest(APFloat::IEEEquad(), true);
215 EXPECT_EQ(test
.next(true), APFloat::opOK
);
216 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
218 // nextUp(-0) = +getSmallest()
219 test
= APFloat::getZero(APFloat::IEEEquad(), true);
220 expected
= APFloat::getSmallest(APFloat::IEEEquad(), false);
221 EXPECT_EQ(test
.next(false), APFloat::opOK
);
222 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
224 // nextDown(-0) = -nextUp(0) = -getSmallest()
225 test
= APFloat::getZero(APFloat::IEEEquad(), true);
226 expected
= APFloat::getSmallest(APFloat::IEEEquad(), true);
227 EXPECT_EQ(test
.next(true), APFloat::opOK
);
228 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
230 // 2. Binade Boundary Tests.
232 // 2a. Test denormal <-> normal binade boundaries.
233 // * nextUp(+Largest Denormal) -> +Smallest Normal.
234 // * nextDown(-Largest Denormal) -> -Smallest Normal.
235 // * nextUp(-Smallest Normal) -> -Largest Denormal.
236 // * nextDown(+Smallest Normal) -> +Largest Denormal.
238 // nextUp(+Largest Denormal) -> +Smallest Normal.
239 test
= APFloat(APFloat::IEEEquad(), "0x0.ffffffffffffffffffffffffffffp-16382");
240 expected
= APFloat(APFloat::IEEEquad(),
241 "0x1.0000000000000000000000000000p-16382");
242 EXPECT_EQ(test
.next(false), APFloat::opOK
);
243 EXPECT_FALSE(test
.isDenormal());
244 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
246 // nextDown(-Largest Denormal) -> -Smallest Normal.
247 test
= APFloat(APFloat::IEEEquad(),
248 "-0x0.ffffffffffffffffffffffffffffp-16382");
249 expected
= APFloat(APFloat::IEEEquad(),
250 "-0x1.0000000000000000000000000000p-16382");
251 EXPECT_EQ(test
.next(true), APFloat::opOK
);
252 EXPECT_FALSE(test
.isDenormal());
253 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
255 // nextUp(-Smallest Normal) -> -LargestDenormal.
256 test
= APFloat(APFloat::IEEEquad(),
257 "-0x1.0000000000000000000000000000p-16382");
258 expected
= APFloat(APFloat::IEEEquad(),
259 "-0x0.ffffffffffffffffffffffffffffp-16382");
260 EXPECT_EQ(test
.next(false), APFloat::opOK
);
261 EXPECT_TRUE(test
.isDenormal());
262 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
264 // nextDown(+Smallest Normal) -> +Largest Denormal.
265 test
= APFloat(APFloat::IEEEquad(),
266 "+0x1.0000000000000000000000000000p-16382");
267 expected
= APFloat(APFloat::IEEEquad(),
268 "+0x0.ffffffffffffffffffffffffffffp-16382");
269 EXPECT_EQ(test
.next(true), APFloat::opOK
);
270 EXPECT_TRUE(test
.isDenormal());
271 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
273 // 2b. Test normal <-> normal binade boundaries.
274 // * nextUp(-Normal Binade Boundary) -> -Normal Binade Boundary + 1.
275 // * nextDown(+Normal Binade Boundary) -> +Normal Binade Boundary - 1.
276 // * nextUp(+Normal Binade Boundary - 1) -> +Normal Binade Boundary.
277 // * nextDown(-Normal Binade Boundary + 1) -> -Normal Binade Boundary.
279 // nextUp(-Normal Binade Boundary) -> -Normal Binade Boundary + 1.
280 test
= APFloat(APFloat::IEEEquad(), "-0x1p+1");
281 expected
= APFloat(APFloat::IEEEquad(),
282 "-0x1.ffffffffffffffffffffffffffffp+0");
283 EXPECT_EQ(test
.next(false), APFloat::opOK
);
284 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
286 // nextDown(+Normal Binade Boundary) -> +Normal Binade Boundary - 1.
287 test
= APFloat(APFloat::IEEEquad(), "0x1p+1");
288 expected
= APFloat(APFloat::IEEEquad(), "0x1.ffffffffffffffffffffffffffffp+0");
289 EXPECT_EQ(test
.next(true), APFloat::opOK
);
290 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
292 // nextUp(+Normal Binade Boundary - 1) -> +Normal Binade Boundary.
293 test
= APFloat(APFloat::IEEEquad(), "0x1.ffffffffffffffffffffffffffffp+0");
294 expected
= APFloat(APFloat::IEEEquad(), "0x1p+1");
295 EXPECT_EQ(test
.next(false), APFloat::opOK
);
296 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
298 // nextDown(-Normal Binade Boundary + 1) -> -Normal Binade Boundary.
299 test
= APFloat(APFloat::IEEEquad(), "-0x1.ffffffffffffffffffffffffffffp+0");
300 expected
= APFloat(APFloat::IEEEquad(), "-0x1p+1");
301 EXPECT_EQ(test
.next(true), APFloat::opOK
);
302 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
304 // 2c. Test using next at binade boundaries with a direction away from the
305 // binade boundary. Away from denormal <-> normal boundaries.
307 // This is to make sure that even though we are at a binade boundary, since
308 // we are rounding away, we do not trigger the binade boundary code. Thus we
310 // * nextUp(-Largest Denormal) -> -Largest Denormal + inc.
311 // * nextDown(+Largest Denormal) -> +Largest Denormal - inc.
312 // * nextUp(+Smallest Normal) -> +Smallest Normal + inc.
313 // * nextDown(-Smallest Normal) -> -Smallest Normal - inc.
315 // nextUp(-Largest Denormal) -> -Largest Denormal + inc.
316 test
= APFloat(APFloat::IEEEquad(), "-0x0.ffffffffffffffffffffffffffffp-16382");
317 expected
= APFloat(APFloat::IEEEquad(),
318 "-0x0.fffffffffffffffffffffffffffep-16382");
319 EXPECT_EQ(test
.next(false), APFloat::opOK
);
320 EXPECT_TRUE(test
.isDenormal());
321 EXPECT_TRUE(test
.isNegative());
322 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
324 // nextDown(+Largest Denormal) -> +Largest Denormal - inc.
325 test
= APFloat(APFloat::IEEEquad(), "0x0.ffffffffffffffffffffffffffffp-16382");
326 expected
= APFloat(APFloat::IEEEquad(),
327 "0x0.fffffffffffffffffffffffffffep-16382");
328 EXPECT_EQ(test
.next(true), APFloat::opOK
);
329 EXPECT_TRUE(test
.isDenormal());
330 EXPECT_TRUE(!test
.isNegative());
331 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
333 // nextUp(+Smallest Normal) -> +Smallest Normal + inc.
334 test
= APFloat(APFloat::IEEEquad(), "0x1.0000000000000000000000000000p-16382");
335 expected
= APFloat(APFloat::IEEEquad(),
336 "0x1.0000000000000000000000000001p-16382");
337 EXPECT_EQ(test
.next(false), APFloat::opOK
);
338 EXPECT_TRUE(!test
.isDenormal());
339 EXPECT_TRUE(!test
.isNegative());
340 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
342 // nextDown(-Smallest Normal) -> -Smallest Normal - inc.
343 test
= APFloat(APFloat::IEEEquad(), "-0x1.0000000000000000000000000000p-16382");
344 expected
= APFloat(APFloat::IEEEquad(),
345 "-0x1.0000000000000000000000000001p-16382");
346 EXPECT_EQ(test
.next(true), APFloat::opOK
);
347 EXPECT_TRUE(!test
.isDenormal());
348 EXPECT_TRUE(test
.isNegative());
349 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
351 // 2d. Test values which cause our exponent to go to min exponent. This
352 // is to ensure that guards in the code to check for min exponent
354 // * nextUp(-0x1p-16381) -> -0x1.ffffffffffffffffffffffffffffp-16382
355 // * nextDown(-0x1.ffffffffffffffffffffffffffffp-16382) ->
357 // * nextUp(0x1.ffffffffffffffffffffffffffffp-16382) -> 0x1p-16382
358 // * nextDown(0x1p-16382) -> 0x1.ffffffffffffffffffffffffffffp-16382
360 // nextUp(-0x1p-16381) -> -0x1.ffffffffffffffffffffffffffffp-16382
361 test
= APFloat(APFloat::IEEEquad(), "-0x1p-16381");
362 expected
= APFloat(APFloat::IEEEquad(),
363 "-0x1.ffffffffffffffffffffffffffffp-16382");
364 EXPECT_EQ(test
.next(false), APFloat::opOK
);
365 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
367 // nextDown(-0x1.ffffffffffffffffffffffffffffp-16382) ->
369 test
= APFloat(APFloat::IEEEquad(), "-0x1.ffffffffffffffffffffffffffffp-16382");
370 expected
= APFloat(APFloat::IEEEquad(), "-0x1p-16381");
371 EXPECT_EQ(test
.next(true), APFloat::opOK
);
372 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
374 // nextUp(0x1.ffffffffffffffffffffffffffffp-16382) -> 0x1p-16381
375 test
= APFloat(APFloat::IEEEquad(), "0x1.ffffffffffffffffffffffffffffp-16382");
376 expected
= APFloat(APFloat::IEEEquad(), "0x1p-16381");
377 EXPECT_EQ(test
.next(false), APFloat::opOK
);
378 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
380 // nextDown(0x1p-16381) -> 0x1.ffffffffffffffffffffffffffffp-16382
381 test
= APFloat(APFloat::IEEEquad(), "0x1p-16381");
382 expected
= APFloat(APFloat::IEEEquad(),
383 "0x1.ffffffffffffffffffffffffffffp-16382");
384 EXPECT_EQ(test
.next(true), APFloat::opOK
);
385 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
387 // 3. Now we test both denormal/normal computation which will not cause us
388 // to go across binade boundaries. Specifically we test:
389 // * nextUp(+Denormal) -> +Denormal.
390 // * nextDown(+Denormal) -> +Denormal.
391 // * nextUp(-Denormal) -> -Denormal.
392 // * nextDown(-Denormal) -> -Denormal.
393 // * nextUp(+Normal) -> +Normal.
394 // * nextDown(+Normal) -> +Normal.
395 // * nextUp(-Normal) -> -Normal.
396 // * nextDown(-Normal) -> -Normal.
398 // nextUp(+Denormal) -> +Denormal.
399 test
= APFloat(APFloat::IEEEquad(),
400 "0x0.ffffffffffffffffffffffff000cp-16382");
401 expected
= APFloat(APFloat::IEEEquad(),
402 "0x0.ffffffffffffffffffffffff000dp-16382");
403 EXPECT_EQ(test
.next(false), APFloat::opOK
);
404 EXPECT_TRUE(test
.isDenormal());
405 EXPECT_TRUE(!test
.isNegative());
406 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
408 // nextDown(+Denormal) -> +Denormal.
409 test
= APFloat(APFloat::IEEEquad(),
410 "0x0.ffffffffffffffffffffffff000cp-16382");
411 expected
= APFloat(APFloat::IEEEquad(),
412 "0x0.ffffffffffffffffffffffff000bp-16382");
413 EXPECT_EQ(test
.next(true), APFloat::opOK
);
414 EXPECT_TRUE(test
.isDenormal());
415 EXPECT_TRUE(!test
.isNegative());
416 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
418 // nextUp(-Denormal) -> -Denormal.
419 test
= APFloat(APFloat::IEEEquad(),
420 "-0x0.ffffffffffffffffffffffff000cp-16382");
421 expected
= APFloat(APFloat::IEEEquad(),
422 "-0x0.ffffffffffffffffffffffff000bp-16382");
423 EXPECT_EQ(test
.next(false), APFloat::opOK
);
424 EXPECT_TRUE(test
.isDenormal());
425 EXPECT_TRUE(test
.isNegative());
426 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
428 // nextDown(-Denormal) -> -Denormal
429 test
= APFloat(APFloat::IEEEquad(),
430 "-0x0.ffffffffffffffffffffffff000cp-16382");
431 expected
= APFloat(APFloat::IEEEquad(),
432 "-0x0.ffffffffffffffffffffffff000dp-16382");
433 EXPECT_EQ(test
.next(true), APFloat::opOK
);
434 EXPECT_TRUE(test
.isDenormal());
435 EXPECT_TRUE(test
.isNegative());
436 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
438 // nextUp(+Normal) -> +Normal.
439 test
= APFloat(APFloat::IEEEquad(),
440 "0x1.ffffffffffffffffffffffff000cp-16000");
441 expected
= APFloat(APFloat::IEEEquad(),
442 "0x1.ffffffffffffffffffffffff000dp-16000");
443 EXPECT_EQ(test
.next(false), APFloat::opOK
);
444 EXPECT_TRUE(!test
.isDenormal());
445 EXPECT_TRUE(!test
.isNegative());
446 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
448 // nextDown(+Normal) -> +Normal.
449 test
= APFloat(APFloat::IEEEquad(),
450 "0x1.ffffffffffffffffffffffff000cp-16000");
451 expected
= APFloat(APFloat::IEEEquad(),
452 "0x1.ffffffffffffffffffffffff000bp-16000");
453 EXPECT_EQ(test
.next(true), APFloat::opOK
);
454 EXPECT_TRUE(!test
.isDenormal());
455 EXPECT_TRUE(!test
.isNegative());
456 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
458 // nextUp(-Normal) -> -Normal.
459 test
= APFloat(APFloat::IEEEquad(),
460 "-0x1.ffffffffffffffffffffffff000cp-16000");
461 expected
= APFloat(APFloat::IEEEquad(),
462 "-0x1.ffffffffffffffffffffffff000bp-16000");
463 EXPECT_EQ(test
.next(false), APFloat::opOK
);
464 EXPECT_TRUE(!test
.isDenormal());
465 EXPECT_TRUE(test
.isNegative());
466 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
468 // nextDown(-Normal) -> -Normal.
469 test
= APFloat(APFloat::IEEEquad(),
470 "-0x1.ffffffffffffffffffffffff000cp-16000");
471 expected
= APFloat(APFloat::IEEEquad(),
472 "-0x1.ffffffffffffffffffffffff000dp-16000");
473 EXPECT_EQ(test
.next(true), APFloat::opOK
);
474 EXPECT_TRUE(!test
.isDenormal());
475 EXPECT_TRUE(test
.isNegative());
476 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
479 TEST(APFloatTest
, FMA
) {
480 APFloat::roundingMode rdmd
= APFloat::rmNearestTiesToEven
;
486 f1
.fusedMultiplyAdd(f2
, f3
, APFloat::rmNearestTiesToEven
);
487 EXPECT_EQ(14.75f
, f1
.convertToFloat());
492 APFloat
f1((float)1.17549435e-38F
);
493 APFloat
f2((float)1.17549435e-38F
);
494 f1
.divide(Val2
, rdmd
);
495 f2
.divide(Val2
, rdmd
);
497 f1
.fusedMultiplyAdd(f2
, f3
, APFloat::rmNearestTiesToEven
);
498 EXPECT_EQ(12.0f
, f1
.convertToFloat());
501 // Test for correct zero sign when answer is exactly zero.
502 // fma(1.0, -1.0, 1.0) -> +ve 0.
507 f1
.fusedMultiplyAdd(f2
, f3
, APFloat::rmNearestTiesToEven
);
508 EXPECT_TRUE(!f1
.isNegative() && f1
.isZero());
511 // Test for correct zero sign when answer is exactly zero and rounding towards
513 // fma(1.0, -1.0, 1.0) -> +ve 0.
518 f1
.fusedMultiplyAdd(f2
, f3
, APFloat::rmTowardNegative
);
519 EXPECT_TRUE(f1
.isNegative() && f1
.isZero());
522 // Test for correct (in this case -ve) sign when adding like signed zeros.
523 // Test fma(0.0, -0.0, -0.0) -> -ve 0.
528 f1
.fusedMultiplyAdd(f2
, f3
, APFloat::rmNearestTiesToEven
);
529 EXPECT_TRUE(f1
.isNegative() && f1
.isZero());
532 // Test -ve sign preservation when small negative results underflow.
534 APFloat
f1(APFloat::IEEEdouble(), "-0x1p-1074");
535 APFloat
f2(APFloat::IEEEdouble(), "+0x1p-1074");
537 f1
.fusedMultiplyAdd(f2
, f3
, APFloat::rmNearestTiesToEven
);
538 EXPECT_TRUE(f1
.isNegative() && f1
.isZero());
541 // Test x87 extended precision case from http://llvm.org/PR20728.
543 APFloat
M1(APFloat::x87DoubleExtended(), 1);
544 APFloat
M2(APFloat::x87DoubleExtended(), 1);
545 APFloat
A(APFloat::x87DoubleExtended(), 3);
547 bool losesInfo
= false;
548 M1
.fusedMultiplyAdd(M1
, A
, APFloat::rmNearestTiesToEven
);
549 M1
.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven
, &losesInfo
);
550 EXPECT_FALSE(losesInfo
);
551 EXPECT_EQ(4.0f
, M1
.convertToFloat());
554 // Regression test that failed an assertion.
556 APFloat
f1(-8.85242279E-41f
);
558 APFloat
f3(8.85242279E-41f
);
559 f1
.fusedMultiplyAdd(f2
, f3
, APFloat::rmNearestTiesToEven
);
560 EXPECT_EQ(-8.85242279E-41f
, f1
.convertToFloat());
563 // Test using only a single instance of APFloat.
567 F
.fusedMultiplyAdd(F
, F
, APFloat::rmNearestTiesToEven
);
568 EXPECT_EQ(3.75, F
.convertToDouble());
572 TEST(APFloatTest
, MinNum
) {
575 APFloat nan
= APFloat::getNaN(APFloat::IEEEdouble());
577 EXPECT_EQ(1.0, minnum(f1
, f2
).convertToDouble());
578 EXPECT_EQ(1.0, minnum(f2
, f1
).convertToDouble());
579 EXPECT_EQ(1.0, minnum(f1
, nan
).convertToDouble());
580 EXPECT_EQ(1.0, minnum(nan
, f1
).convertToDouble());
584 EXPECT_EQ(-0.0, minnum(zp
, zn
).convertToDouble());
585 EXPECT_EQ(-0.0, minnum(zn
, zp
).convertToDouble());
588 TEST(APFloatTest
, MaxNum
) {
591 APFloat nan
= APFloat::getNaN(APFloat::IEEEdouble());
593 EXPECT_EQ(2.0, maxnum(f1
, f2
).convertToDouble());
594 EXPECT_EQ(2.0, maxnum(f2
, f1
).convertToDouble());
595 EXPECT_EQ(1.0, maxnum(f1
, nan
).convertToDouble());
596 EXPECT_EQ(1.0, maxnum(nan
, f1
).convertToDouble());
600 EXPECT_EQ(0.0, maxnum(zp
, zn
).convertToDouble());
601 EXPECT_EQ(0.0, maxnum(zn
, zp
).convertToDouble());
604 TEST(APFloatTest
, Minimum
) {
609 APFloat nan
= APFloat::getNaN(APFloat::IEEEdouble());
611 EXPECT_EQ(1.0, minimum(f1
, f2
).convertToDouble());
612 EXPECT_EQ(1.0, minimum(f2
, f1
).convertToDouble());
613 EXPECT_EQ(-0.0, minimum(zp
, zn
).convertToDouble());
614 EXPECT_EQ(-0.0, minimum(zn
, zp
).convertToDouble());
615 EXPECT_TRUE(std::isnan(minimum(f1
, nan
).convertToDouble()));
616 EXPECT_TRUE(std::isnan(minimum(nan
, f1
).convertToDouble()));
619 TEST(APFloatTest
, Maximum
) {
624 APFloat nan
= APFloat::getNaN(APFloat::IEEEdouble());
626 EXPECT_EQ(2.0, maximum(f1
, f2
).convertToDouble());
627 EXPECT_EQ(2.0, maximum(f2
, f1
).convertToDouble());
628 EXPECT_EQ(0.0, maximum(zp
, zn
).convertToDouble());
629 EXPECT_EQ(0.0, maximum(zn
, zp
).convertToDouble());
630 EXPECT_TRUE(std::isnan(maximum(f1
, nan
).convertToDouble()));
631 EXPECT_TRUE(std::isnan(maximum(nan
, f1
).convertToDouble()));
634 TEST(APFloatTest
, MinimumNumber
) {
639 APInt
intPayload_89ab(64, 0x89ab);
640 APInt
intPayload_cdef(64, 0xcdef);
641 APFloat nan_0123
[2] = {APFloat::getNaN(APFloat::IEEEdouble(), false, 0x0123),
642 APFloat::getNaN(APFloat::IEEEdouble(), false, 0x0123)};
643 APFloat mnan_4567
[2] = {APFloat::getNaN(APFloat::IEEEdouble(), true, 0x4567),
644 APFloat::getNaN(APFloat::IEEEdouble(), true, 0x4567)};
645 APFloat nan_89ab
[2] = {
646 APFloat::getSNaN(APFloat::IEEEdouble(), false, &intPayload_89ab
),
647 APFloat::getNaN(APFloat::IEEEdouble(), false, 0x89ab)};
648 APFloat mnan_cdef
[2] = {
649 APFloat::getSNaN(APFloat::IEEEdouble(), true, &intPayload_cdef
),
650 APFloat::getNaN(APFloat::IEEEdouble(), true, 0xcdef)};
652 EXPECT_TRUE(f1
.bitwiseIsEqual(minimumnum(f1
, f2
)));
653 EXPECT_TRUE(f1
.bitwiseIsEqual(minimumnum(f2
, f1
)));
654 EXPECT_TRUE(zn
.bitwiseIsEqual(minimumnum(zp
, zn
)));
655 EXPECT_TRUE(zn
.bitwiseIsEqual(minimumnum(zn
, zp
)));
657 EXPECT_TRUE(minimumnum(zn
, zp
).isNegative());
658 EXPECT_TRUE(minimumnum(zp
, zn
).isNegative());
659 EXPECT_TRUE(minimumnum(zn
, zn
).isNegative());
660 EXPECT_FALSE(minimumnum(zp
, zp
).isNegative());
662 for (APFloat n
: {nan_0123
[0], mnan_4567
[0], nan_89ab
[0], mnan_cdef
[0]})
663 for (APFloat f
: {f1
, f2
, zn
, zp
}) {
664 APFloat res
= minimumnum(f
, n
);
665 EXPECT_FALSE(res
.isNaN());
666 EXPECT_TRUE(res
.bitwiseIsEqual(f
));
667 res
= minimumnum(n
, f
);
668 EXPECT_FALSE(res
.isNaN());
669 EXPECT_TRUE(res
.bitwiseIsEqual(f
));
672 // When NaN vs NaN, we should keep payload/sign of either one.
673 for (auto n1
: {nan_0123
, mnan_4567
, nan_89ab
, mnan_cdef
})
674 for (auto n2
: {nan_0123
, mnan_4567
, nan_89ab
, mnan_cdef
}) {
675 APFloat res
= minimumnum(n1
[0], n2
[0]);
676 EXPECT_TRUE(res
.bitwiseIsEqual(n1
[1]) || res
.bitwiseIsEqual(n2
[1]));
677 EXPECT_FALSE(res
.isSignaling());
681 TEST(APFloatTest
, MaximumNumber
) {
686 APInt
intPayload_89ab(64, 0x89ab);
687 APInt
intPayload_cdef(64, 0xcdef);
688 APFloat nan_0123
[2] = {APFloat::getNaN(APFloat::IEEEdouble(), false, 0x0123),
689 APFloat::getNaN(APFloat::IEEEdouble(), false, 0x0123)};
690 APFloat mnan_4567
[2] = {APFloat::getNaN(APFloat::IEEEdouble(), true, 0x4567),
691 APFloat::getNaN(APFloat::IEEEdouble(), true, 0x4567)};
692 APFloat nan_89ab
[2] = {
693 APFloat::getSNaN(APFloat::IEEEdouble(), false, &intPayload_89ab
),
694 APFloat::getNaN(APFloat::IEEEdouble(), false, 0x89ab)};
695 APFloat mnan_cdef
[2] = {
696 APFloat::getSNaN(APFloat::IEEEdouble(), true, &intPayload_cdef
),
697 APFloat::getNaN(APFloat::IEEEdouble(), true, 0xcdef)};
699 EXPECT_TRUE(f2
.bitwiseIsEqual(maximumnum(f1
, f2
)));
700 EXPECT_TRUE(f2
.bitwiseIsEqual(maximumnum(f2
, f1
)));
701 EXPECT_TRUE(zp
.bitwiseIsEqual(maximumnum(zp
, zn
)));
702 EXPECT_TRUE(zp
.bitwiseIsEqual(maximumnum(zn
, zp
)));
704 EXPECT_FALSE(maximumnum(zn
, zp
).isNegative());
705 EXPECT_FALSE(maximumnum(zp
, zn
).isNegative());
706 EXPECT_TRUE(maximumnum(zn
, zn
).isNegative());
707 EXPECT_FALSE(maximumnum(zp
, zp
).isNegative());
709 for (APFloat n
: {nan_0123
[0], mnan_4567
[0], nan_89ab
[0], mnan_cdef
[0]})
710 for (APFloat f
: {f1
, f2
, zn
, zp
}) {
711 APFloat res
= maximumnum(f
, n
);
712 EXPECT_FALSE(res
.isNaN());
713 EXPECT_TRUE(res
.bitwiseIsEqual(f
));
714 res
= maximumnum(n
, f
);
715 EXPECT_FALSE(res
.isNaN());
716 EXPECT_TRUE(res
.bitwiseIsEqual(f
));
719 // When NaN vs NaN, we should keep payload/sign of either one.
720 for (auto n1
: {nan_0123
, mnan_4567
, nan_89ab
, mnan_cdef
})
721 for (auto n2
: {nan_0123
, mnan_4567
, nan_89ab
, mnan_cdef
}) {
722 APFloat res
= maximumnum(n1
[0], n2
[0]);
723 EXPECT_TRUE(res
.bitwiseIsEqual(n1
[1]) || res
.bitwiseIsEqual(n2
[1]));
724 EXPECT_FALSE(res
.isSignaling());
728 TEST(APFloatTest
, Denormal
) {
729 APFloat::roundingMode rdmd
= APFloat::rmNearestTiesToEven
;
731 // Test single precision
733 const char *MinNormalStr
= "1.17549435082228750797e-38";
734 EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), MinNormalStr
).isDenormal());
735 EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), 0).isDenormal());
737 APFloat
Val2(APFloat::IEEEsingle(), 2);
738 APFloat
T(APFloat::IEEEsingle(), MinNormalStr
);
739 T
.divide(Val2
, rdmd
);
740 EXPECT_TRUE(T
.isDenormal());
741 EXPECT_EQ(fcPosSubnormal
, T
.classify());
744 const char *NegMinNormalStr
= "-1.17549435082228750797e-38";
745 EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), NegMinNormalStr
).isDenormal());
746 APFloat
NegT(APFloat::IEEEsingle(), NegMinNormalStr
);
747 NegT
.divide(Val2
, rdmd
);
748 EXPECT_TRUE(NegT
.isDenormal());
749 EXPECT_EQ(fcNegSubnormal
, NegT
.classify());
752 // Test double precision
754 const char *MinNormalStr
= "2.22507385850720138309e-308";
755 EXPECT_FALSE(APFloat(APFloat::IEEEdouble(), MinNormalStr
).isDenormal());
756 EXPECT_FALSE(APFloat(APFloat::IEEEdouble(), 0).isDenormal());
758 APFloat
Val2(APFloat::IEEEdouble(), 2);
759 APFloat
T(APFloat::IEEEdouble(), MinNormalStr
);
760 T
.divide(Val2
, rdmd
);
761 EXPECT_TRUE(T
.isDenormal());
762 EXPECT_EQ(fcPosSubnormal
, T
.classify());
765 // Test Intel double-ext
767 const char *MinNormalStr
= "3.36210314311209350626e-4932";
768 EXPECT_FALSE(APFloat(APFloat::x87DoubleExtended(), MinNormalStr
).isDenormal());
769 EXPECT_FALSE(APFloat(APFloat::x87DoubleExtended(), 0).isDenormal());
771 APFloat
Val2(APFloat::x87DoubleExtended(), 2);
772 APFloat
T(APFloat::x87DoubleExtended(), MinNormalStr
);
773 T
.divide(Val2
, rdmd
);
774 EXPECT_TRUE(T
.isDenormal());
775 EXPECT_EQ(fcPosSubnormal
, T
.classify());
778 // Test quadruple precision
780 const char *MinNormalStr
= "3.36210314311209350626267781732175260e-4932";
781 EXPECT_FALSE(APFloat(APFloat::IEEEquad(), MinNormalStr
).isDenormal());
782 EXPECT_FALSE(APFloat(APFloat::IEEEquad(), 0).isDenormal());
784 APFloat
Val2(APFloat::IEEEquad(), 2);
785 APFloat
T(APFloat::IEEEquad(), MinNormalStr
);
786 T
.divide(Val2
, rdmd
);
787 EXPECT_TRUE(T
.isDenormal());
788 EXPECT_EQ(fcPosSubnormal
, T
.classify());
793 const char *MinNormalStr
= "1.17549435082228750797e-38";
794 EXPECT_FALSE(APFloat(APFloat::FloatTF32(), MinNormalStr
).isDenormal());
795 EXPECT_FALSE(APFloat(APFloat::FloatTF32(), 0).isDenormal());
797 APFloat
Val2(APFloat::FloatTF32(), 2);
798 APFloat
T(APFloat::FloatTF32(), MinNormalStr
);
799 T
.divide(Val2
, rdmd
);
800 EXPECT_TRUE(T
.isDenormal());
801 EXPECT_EQ(fcPosSubnormal
, T
.classify());
803 const char *NegMinNormalStr
= "-1.17549435082228750797e-38";
804 EXPECT_FALSE(APFloat(APFloat::FloatTF32(), NegMinNormalStr
).isDenormal());
805 APFloat
NegT(APFloat::FloatTF32(), NegMinNormalStr
);
806 NegT
.divide(Val2
, rdmd
);
807 EXPECT_TRUE(NegT
.isDenormal());
808 EXPECT_EQ(fcNegSubnormal
, NegT
.classify());
812 TEST(APFloatTest
, IsSmallestNormalized
) {
813 for (unsigned I
= 0; I
!= APFloat::S_MaxSemantics
+ 1; ++I
) {
814 const fltSemantics
&Semantics
=
815 APFloat::EnumToSemantics(static_cast<APFloat::Semantics
>(I
));
817 EXPECT_FALSE(APFloat::getZero(Semantics
, false).isSmallestNormalized());
818 EXPECT_FALSE(APFloat::getZero(Semantics
, true).isSmallestNormalized());
820 if (APFloat::hasNanOrInf(Semantics
)) {
821 EXPECT_FALSE(APFloat::getInf(Semantics
, false).isSmallestNormalized());
822 EXPECT_FALSE(APFloat::getInf(Semantics
, true).isSmallestNormalized());
824 EXPECT_FALSE(APFloat::getQNaN(Semantics
).isSmallestNormalized());
825 EXPECT_FALSE(APFloat::getSNaN(Semantics
).isSmallestNormalized());
828 EXPECT_FALSE(APFloat::getLargest(Semantics
).isSmallestNormalized());
829 EXPECT_FALSE(APFloat::getLargest(Semantics
, true).isSmallestNormalized());
831 EXPECT_FALSE(APFloat::getSmallest(Semantics
).isSmallestNormalized());
832 EXPECT_FALSE(APFloat::getSmallest(Semantics
, true).isSmallestNormalized());
834 EXPECT_FALSE(APFloat::getAllOnesValue(Semantics
).isSmallestNormalized());
836 APFloat PosSmallestNormalized
=
837 APFloat::getSmallestNormalized(Semantics
, false);
838 APFloat NegSmallestNormalized
=
839 APFloat::getSmallestNormalized(Semantics
, true);
840 EXPECT_TRUE(PosSmallestNormalized
.isSmallestNormalized());
841 EXPECT_TRUE(NegSmallestNormalized
.isSmallestNormalized());
842 EXPECT_EQ(fcPosNormal
, PosSmallestNormalized
.classify());
843 EXPECT_EQ(fcNegNormal
, NegSmallestNormalized
.classify());
845 for (APFloat
*Val
: {&PosSmallestNormalized
, &NegSmallestNormalized
}) {
846 bool OldSign
= Val
->isNegative();
848 // Step down, make sure it's still not smallest normalized.
849 EXPECT_EQ(APFloat::opOK
, Val
->next(false));
850 EXPECT_EQ(OldSign
, Val
->isNegative());
851 EXPECT_FALSE(Val
->isSmallestNormalized());
852 EXPECT_EQ(OldSign
, Val
->isNegative());
854 // Step back up should restore it to being smallest normalized.
855 EXPECT_EQ(APFloat::opOK
, Val
->next(true));
856 EXPECT_TRUE(Val
->isSmallestNormalized());
857 EXPECT_EQ(OldSign
, Val
->isNegative());
859 // Step beyond should no longer smallest normalized.
860 EXPECT_EQ(APFloat::opOK
, Val
->next(true));
861 EXPECT_FALSE(Val
->isSmallestNormalized());
862 EXPECT_EQ(OldSign
, Val
->isNegative());
867 TEST(APFloatTest
, Zero
) {
868 EXPECT_EQ(0.0f
, APFloat(0.0f
).convertToFloat());
869 EXPECT_EQ(-0.0f
, APFloat(-0.0f
).convertToFloat());
870 EXPECT_TRUE(APFloat(-0.0f
).isNegative());
872 EXPECT_EQ(0.0, APFloat(0.0).convertToDouble());
873 EXPECT_EQ(-0.0, APFloat(-0.0).convertToDouble());
874 EXPECT_TRUE(APFloat(-0.0).isNegative());
876 EXPECT_EQ(fcPosZero
, APFloat(0.0).classify());
877 EXPECT_EQ(fcNegZero
, APFloat(-0.0).classify());
880 TEST(APFloatTest
, DecimalStringsWithoutNullTerminators
) {
881 // Make sure that we can parse strings without null terminators.
883 EXPECT_EQ(convertToDoubleFromString(StringRef("0.00", 3)), 0.0);
884 EXPECT_EQ(convertToDoubleFromString(StringRef("0.01", 3)), 0.0);
885 EXPECT_EQ(convertToDoubleFromString(StringRef("0.09", 3)), 0.0);
886 EXPECT_EQ(convertToDoubleFromString(StringRef("0.095", 4)), 0.09);
887 EXPECT_EQ(convertToDoubleFromString(StringRef("0.00e+3", 7)), 0.00);
888 EXPECT_EQ(convertToDoubleFromString(StringRef("0e+3", 4)), 0.00);
891 TEST(APFloatTest
, fromZeroDecimalString
) {
892 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0").convertToDouble());
893 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0").convertToDouble());
894 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0").convertToDouble());
896 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0.").convertToDouble());
897 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.").convertToDouble());
898 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.").convertToDouble());
900 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), ".0").convertToDouble());
901 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+.0").convertToDouble());
902 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-.0").convertToDouble());
904 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0.0").convertToDouble());
905 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.0").convertToDouble());
906 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.0").convertToDouble());
908 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "00000.").convertToDouble());
909 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+00000.").convertToDouble());
910 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-00000.").convertToDouble());
912 EXPECT_EQ(0.0, APFloat(APFloat::IEEEdouble(), ".00000").convertToDouble());
913 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+.00000").convertToDouble());
914 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-.00000").convertToDouble());
916 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0000.00000").convertToDouble());
917 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0000.00000").convertToDouble());
918 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0000.00000").convertToDouble());
921 TEST(APFloatTest
, fromZeroDecimalSingleExponentString
) {
922 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0e1").convertToDouble());
923 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0e1").convertToDouble());
924 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0e1").convertToDouble());
926 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0e+1").convertToDouble());
927 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0e+1").convertToDouble());
928 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0e+1").convertToDouble());
930 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0e-1").convertToDouble());
931 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0e-1").convertToDouble());
932 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0e-1").convertToDouble());
935 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0.e1").convertToDouble());
936 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.e1").convertToDouble());
937 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.e1").convertToDouble());
939 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0.e+1").convertToDouble());
940 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.e+1").convertToDouble());
941 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.e+1").convertToDouble());
943 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0.e-1").convertToDouble());
944 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.e-1").convertToDouble());
945 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.e-1").convertToDouble());
947 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), ".0e1").convertToDouble());
948 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+.0e1").convertToDouble());
949 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-.0e1").convertToDouble());
951 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), ".0e+1").convertToDouble());
952 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+.0e+1").convertToDouble());
953 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-.0e+1").convertToDouble());
955 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), ".0e-1").convertToDouble());
956 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+.0e-1").convertToDouble());
957 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-.0e-1").convertToDouble());
960 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0.0e1").convertToDouble());
961 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.0e1").convertToDouble());
962 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.0e1").convertToDouble());
964 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0.0e+1").convertToDouble());
965 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.0e+1").convertToDouble());
966 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.0e+1").convertToDouble());
968 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0.0e-1").convertToDouble());
969 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.0e-1").convertToDouble());
970 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.0e-1").convertToDouble());
973 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "000.0000e1").convertToDouble());
974 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+000.0000e+1").convertToDouble());
975 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-000.0000e+1").convertToDouble());
978 TEST(APFloatTest
, fromZeroDecimalLargeExponentString
) {
979 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0e1234").convertToDouble());
980 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0e1234").convertToDouble());
981 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0e1234").convertToDouble());
983 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0e+1234").convertToDouble());
984 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0e+1234").convertToDouble());
985 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0e+1234").convertToDouble());
987 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0e-1234").convertToDouble());
988 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0e-1234").convertToDouble());
989 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0e-1234").convertToDouble());
991 EXPECT_EQ(0.0, APFloat(APFloat::IEEEdouble(), "000.0000e1234").convertToDouble());
992 EXPECT_EQ(0.0, APFloat(APFloat::IEEEdouble(), "000.0000e-1234").convertToDouble());
994 EXPECT_EQ(0.0, APFloat(APFloat::IEEEdouble(), StringRef("0e1234" "\0" "2", 6)).convertToDouble());
997 TEST(APFloatTest
, fromZeroHexadecimalString
) {
998 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0p1").convertToDouble());
999 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0p1").convertToDouble());
1000 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0p1").convertToDouble());
1002 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0p+1").convertToDouble());
1003 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0p+1").convertToDouble());
1004 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0p+1").convertToDouble());
1006 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0p-1").convertToDouble());
1007 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0p-1").convertToDouble());
1008 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0p-1").convertToDouble());
1011 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0.p1").convertToDouble());
1012 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0.p1").convertToDouble());
1013 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0.p1").convertToDouble());
1015 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0.p+1").convertToDouble());
1016 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0.p+1").convertToDouble());
1017 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0.p+1").convertToDouble());
1019 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0.p-1").convertToDouble());
1020 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0.p-1").convertToDouble());
1021 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0.p-1").convertToDouble());
1024 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x.0p1").convertToDouble());
1025 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x.0p1").convertToDouble());
1026 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x.0p1").convertToDouble());
1028 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x.0p+1").convertToDouble());
1029 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x.0p+1").convertToDouble());
1030 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x.0p+1").convertToDouble());
1032 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x.0p-1").convertToDouble());
1033 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x.0p-1").convertToDouble());
1034 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x.0p-1").convertToDouble());
1037 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0.0p1").convertToDouble());
1038 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0.0p1").convertToDouble());
1039 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0.0p1").convertToDouble());
1041 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0.0p+1").convertToDouble());
1042 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0.0p+1").convertToDouble());
1043 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0.0p+1").convertToDouble());
1045 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0.0p-1").convertToDouble());
1046 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0.0p-1").convertToDouble());
1047 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0.0p-1").convertToDouble());
1050 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x00000.p1").convertToDouble());
1051 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0000.00000p1").convertToDouble());
1052 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x.00000p1").convertToDouble());
1053 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0.p1").convertToDouble());
1054 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0p1234").convertToDouble());
1055 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0p1234").convertToDouble());
1056 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x00000.p1234").convertToDouble());
1057 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0000.00000p1234").convertToDouble());
1058 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x.00000p1234").convertToDouble());
1059 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0.p1234").convertToDouble());
1062 TEST(APFloatTest
, fromDecimalString
) {
1063 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "1").convertToDouble());
1064 EXPECT_EQ(2.0, APFloat(APFloat::IEEEdouble(), "2.").convertToDouble());
1065 EXPECT_EQ(0.5, APFloat(APFloat::IEEEdouble(), ".5").convertToDouble());
1066 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "1.0").convertToDouble());
1067 EXPECT_EQ(-2.0, APFloat(APFloat::IEEEdouble(), "-2").convertToDouble());
1068 EXPECT_EQ(-4.0, APFloat(APFloat::IEEEdouble(), "-4.").convertToDouble());
1069 EXPECT_EQ(-0.5, APFloat(APFloat::IEEEdouble(), "-.5").convertToDouble());
1070 EXPECT_EQ(-1.5, APFloat(APFloat::IEEEdouble(), "-1.5").convertToDouble());
1071 EXPECT_EQ(1.25e12
, APFloat(APFloat::IEEEdouble(), "1.25e12").convertToDouble());
1072 EXPECT_EQ(1.25e+12, APFloat(APFloat::IEEEdouble(), "1.25e+12").convertToDouble());
1073 EXPECT_EQ(1.25e-12, APFloat(APFloat::IEEEdouble(), "1.25e-12").convertToDouble());
1074 EXPECT_EQ(1024.0, APFloat(APFloat::IEEEdouble(), "1024.").convertToDouble());
1075 EXPECT_EQ(1024.05, APFloat(APFloat::IEEEdouble(), "1024.05000").convertToDouble());
1076 EXPECT_EQ(0.05, APFloat(APFloat::IEEEdouble(), ".05000").convertToDouble());
1077 EXPECT_EQ(2.0, APFloat(APFloat::IEEEdouble(), "2.").convertToDouble());
1078 EXPECT_EQ(2.0e2
, APFloat(APFloat::IEEEdouble(), "2.e2").convertToDouble());
1079 EXPECT_EQ(2.0e+2, APFloat(APFloat::IEEEdouble(), "2.e+2").convertToDouble());
1080 EXPECT_EQ(2.0e-2, APFloat(APFloat::IEEEdouble(), "2.e-2").convertToDouble());
1081 EXPECT_EQ(2.05e2
, APFloat(APFloat::IEEEdouble(), "002.05000e2").convertToDouble());
1082 EXPECT_EQ(2.05e+2, APFloat(APFloat::IEEEdouble(), "002.05000e+2").convertToDouble());
1083 EXPECT_EQ(2.05e-2, APFloat(APFloat::IEEEdouble(), "002.05000e-2").convertToDouble());
1084 EXPECT_EQ(2.05e12
, APFloat(APFloat::IEEEdouble(), "002.05000e12").convertToDouble());
1085 EXPECT_EQ(2.05e+12, APFloat(APFloat::IEEEdouble(), "002.05000e+12").convertToDouble());
1086 EXPECT_EQ(2.05e-12, APFloat(APFloat::IEEEdouble(), "002.05000e-12").convertToDouble());
1088 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "1e").convertToDouble());
1089 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "+1e").convertToDouble());
1090 EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble(), "-1e").convertToDouble());
1092 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "1.e").convertToDouble());
1093 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "+1.e").convertToDouble());
1094 EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble(), "-1.e").convertToDouble());
1096 EXPECT_EQ(0.1, APFloat(APFloat::IEEEdouble(), ".1e").convertToDouble());
1097 EXPECT_EQ(0.1, APFloat(APFloat::IEEEdouble(), "+.1e").convertToDouble());
1098 EXPECT_EQ(-0.1, APFloat(APFloat::IEEEdouble(), "-.1e").convertToDouble());
1100 EXPECT_EQ(1.1, APFloat(APFloat::IEEEdouble(), "1.1e").convertToDouble());
1101 EXPECT_EQ(1.1, APFloat(APFloat::IEEEdouble(), "+1.1e").convertToDouble());
1102 EXPECT_EQ(-1.1, APFloat(APFloat::IEEEdouble(), "-1.1e").convertToDouble());
1104 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "1e+").convertToDouble());
1105 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "1e-").convertToDouble());
1107 EXPECT_EQ(0.1, APFloat(APFloat::IEEEdouble(), ".1e").convertToDouble());
1108 EXPECT_EQ(0.1, APFloat(APFloat::IEEEdouble(), ".1e+").convertToDouble());
1109 EXPECT_EQ(0.1, APFloat(APFloat::IEEEdouble(), ".1e-").convertToDouble());
1111 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "1.0e").convertToDouble());
1112 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "1.0e+").convertToDouble());
1113 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "1.0e-").convertToDouble());
1115 // These are "carefully selected" to overflow the fast log-base
1116 // calculations in APFloat.cpp
1117 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "99e99999").isInfinity());
1118 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-99e99999").isInfinity());
1119 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "1e-99999").isPosZero());
1120 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-1e-99999").isNegZero());
1122 EXPECT_EQ(2.71828, convertToDoubleFromString("2.71828"));
1125 TEST(APFloatTest
, fromStringSpecials
) {
1126 const fltSemantics
&Sem
= APFloat::IEEEdouble();
1127 const unsigned Precision
= 53;
1128 const unsigned PayloadBits
= Precision
- 2;
1129 uint64_t PayloadMask
= (uint64_t(1) << PayloadBits
) - uint64_t(1);
1131 uint64_t NaNPayloads
[] = {
1137 uint64_t(1) << PayloadBits
, // overflow bit
1138 uint64_t(1) << (PayloadBits
- 1), // signaling bit
1139 uint64_t(1) << (PayloadBits
- 2) // highest possible bit
1142 // Convert payload integer to decimal string representation.
1143 std::string NaNPayloadDecStrings
[std::size(NaNPayloads
)];
1144 for (size_t I
= 0; I
< std::size(NaNPayloads
); ++I
)
1145 NaNPayloadDecStrings
[I
] = utostr(NaNPayloads
[I
]);
1147 // Convert payload integer to hexadecimal string representation.
1148 std::string NaNPayloadHexStrings
[std::size(NaNPayloads
)];
1149 for (size_t I
= 0; I
< std::size(NaNPayloads
); ++I
)
1150 NaNPayloadHexStrings
[I
] = "0x" + utohexstr(NaNPayloads
[I
]);
1152 // Fix payloads to expected result.
1153 for (uint64_t &Payload
: NaNPayloads
)
1154 Payload
&= PayloadMask
;
1156 // Signaling NaN must have a non-zero payload. In case a zero payload is
1157 // requested, a default arbitrary payload is set instead. Save this payload
1159 const uint64_t SNaNDefaultPayload
=
1160 APFloat::getSNaN(Sem
).bitcastToAPInt().getZExtValue() & PayloadMask
;
1162 // Negative sign prefix (or none - for positive).
1163 const char Signs
[] = {0, '-'};
1165 // "Signaling" prefix (or none - for "Quiet").
1166 const char NaNTypes
[] = {0, 's', 'S'};
1168 const StringRef NaNStrings
[] = {"nan", "NaN"};
1169 for (StringRef NaNStr
: NaNStrings
)
1170 for (char TypeChar
: NaNTypes
) {
1171 bool Signaling
= (TypeChar
== 's' || TypeChar
== 'S');
1173 for (size_t J
= 0; J
< std::size(NaNPayloads
); ++J
) {
1174 uint64_t Payload
= (Signaling
&& !NaNPayloads
[J
]) ? SNaNDefaultPayload
1176 std::string
&PayloadDec
= NaNPayloadDecStrings
[J
];
1177 std::string
&PayloadHex
= NaNPayloadHexStrings
[J
];
1179 for (char SignChar
: Signs
) {
1180 bool Negative
= (SignChar
== '-');
1182 std::string TestStrings
[5];
1183 size_t NumTestStrings
= 0;
1192 // Test without any paylod.
1194 TestStrings
[NumTestStrings
++] = Prefix
;
1196 // Test with the payload as a suffix.
1197 TestStrings
[NumTestStrings
++] = Prefix
+ PayloadDec
;
1198 TestStrings
[NumTestStrings
++] = Prefix
+ PayloadHex
;
1200 // Test with the payload inside parentheses.
1201 TestStrings
[NumTestStrings
++] = Prefix
+ '(' + PayloadDec
+ ')';
1202 TestStrings
[NumTestStrings
++] = Prefix
+ '(' + PayloadHex
+ ')';
1204 for (size_t K
= 0; K
< NumTestStrings
; ++K
) {
1205 StringRef TestStr
= TestStrings
[K
];
1208 bool HasError
= !F
.convertFromString(
1209 TestStr
, llvm::APFloat::rmNearestTiesToEven
);
1210 EXPECT_FALSE(HasError
);
1211 EXPECT_TRUE(F
.isNaN());
1212 EXPECT_EQ(Signaling
, F
.isSignaling());
1213 EXPECT_EQ(Negative
, F
.isNegative());
1214 uint64_t PayloadResult
=
1215 F
.bitcastToAPInt().getZExtValue() & PayloadMask
;
1216 EXPECT_EQ(Payload
, PayloadResult
);
1222 const StringRef InfStrings
[] = {"inf", "INFINITY", "+Inf",
1223 "-inf", "-INFINITY", "-Inf"};
1224 for (StringRef InfStr
: InfStrings
) {
1225 bool Negative
= InfStr
.front() == '-';
1229 !F
.convertFromString(InfStr
, llvm::APFloat::rmNearestTiesToEven
);
1230 EXPECT_FALSE(HasError
);
1231 EXPECT_TRUE(F
.isInfinity());
1232 EXPECT_EQ(Negative
, F
.isNegative());
1233 uint64_t PayloadResult
= F
.bitcastToAPInt().getZExtValue() & PayloadMask
;
1234 EXPECT_EQ(UINT64_C(0), PayloadResult
);
1238 TEST(APFloatTest
, fromToStringSpecials
) {
1239 auto expects
= [] (const char *first
, const char *second
) {
1240 std::string roundtrip
= convertToString(convertToDoubleFromString(second
), 0, 3);
1241 EXPECT_STREQ(first
, roundtrip
.c_str());
1243 expects("+Inf", "+Inf");
1244 expects("+Inf", "INFINITY");
1245 expects("+Inf", "inf");
1246 expects("-Inf", "-Inf");
1247 expects("-Inf", "-INFINITY");
1248 expects("-Inf", "-inf");
1249 expects("NaN", "NaN");
1250 expects("NaN", "nan");
1251 expects("NaN", "-NaN");
1252 expects("NaN", "-nan");
1255 TEST(APFloatTest
, fromHexadecimalString
) {
1256 EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble(), "0x1p0").convertToDouble());
1257 EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble(), "+0x1p0").convertToDouble());
1258 EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble(), "-0x1p0").convertToDouble());
1260 EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble(), "0x1p+0").convertToDouble());
1261 EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble(), "+0x1p+0").convertToDouble());
1262 EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble(), "-0x1p+0").convertToDouble());
1264 EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble(), "0x1p-0").convertToDouble());
1265 EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble(), "+0x1p-0").convertToDouble());
1266 EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble(), "-0x1p-0").convertToDouble());
1269 EXPECT_EQ( 2.0, APFloat(APFloat::IEEEdouble(), "0x1p1").convertToDouble());
1270 EXPECT_EQ(+2.0, APFloat(APFloat::IEEEdouble(), "+0x1p1").convertToDouble());
1271 EXPECT_EQ(-2.0, APFloat(APFloat::IEEEdouble(), "-0x1p1").convertToDouble());
1273 EXPECT_EQ( 2.0, APFloat(APFloat::IEEEdouble(), "0x1p+1").convertToDouble());
1274 EXPECT_EQ(+2.0, APFloat(APFloat::IEEEdouble(), "+0x1p+1").convertToDouble());
1275 EXPECT_EQ(-2.0, APFloat(APFloat::IEEEdouble(), "-0x1p+1").convertToDouble());
1277 EXPECT_EQ( 0.5, APFloat(APFloat::IEEEdouble(), "0x1p-1").convertToDouble());
1278 EXPECT_EQ(+0.5, APFloat(APFloat::IEEEdouble(), "+0x1p-1").convertToDouble());
1279 EXPECT_EQ(-0.5, APFloat(APFloat::IEEEdouble(), "-0x1p-1").convertToDouble());
1282 EXPECT_EQ( 3.0, APFloat(APFloat::IEEEdouble(), "0x1.8p1").convertToDouble());
1283 EXPECT_EQ(+3.0, APFloat(APFloat::IEEEdouble(), "+0x1.8p1").convertToDouble());
1284 EXPECT_EQ(-3.0, APFloat(APFloat::IEEEdouble(), "-0x1.8p1").convertToDouble());
1286 EXPECT_EQ( 3.0, APFloat(APFloat::IEEEdouble(), "0x1.8p+1").convertToDouble());
1287 EXPECT_EQ(+3.0, APFloat(APFloat::IEEEdouble(), "+0x1.8p+1").convertToDouble());
1288 EXPECT_EQ(-3.0, APFloat(APFloat::IEEEdouble(), "-0x1.8p+1").convertToDouble());
1290 EXPECT_EQ( 0.75, APFloat(APFloat::IEEEdouble(), "0x1.8p-1").convertToDouble());
1291 EXPECT_EQ(+0.75, APFloat(APFloat::IEEEdouble(), "+0x1.8p-1").convertToDouble());
1292 EXPECT_EQ(-0.75, APFloat(APFloat::IEEEdouble(), "-0x1.8p-1").convertToDouble());
1295 EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble(), "0x1000.000p1").convertToDouble());
1296 EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble(), "+0x1000.000p1").convertToDouble());
1297 EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble(), "-0x1000.000p1").convertToDouble());
1299 EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble(), "0x1000.000p+1").convertToDouble());
1300 EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble(), "+0x1000.000p+1").convertToDouble());
1301 EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble(), "-0x1000.000p+1").convertToDouble());
1303 EXPECT_EQ( 2048.0, APFloat(APFloat::IEEEdouble(), "0x1000.000p-1").convertToDouble());
1304 EXPECT_EQ(+2048.0, APFloat(APFloat::IEEEdouble(), "+0x1000.000p-1").convertToDouble());
1305 EXPECT_EQ(-2048.0, APFloat(APFloat::IEEEdouble(), "-0x1000.000p-1").convertToDouble());
1308 EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble(), "0x1000p1").convertToDouble());
1309 EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble(), "+0x1000p1").convertToDouble());
1310 EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble(), "-0x1000p1").convertToDouble());
1312 EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble(), "0x1000p+1").convertToDouble());
1313 EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble(), "+0x1000p+1").convertToDouble());
1314 EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble(), "-0x1000p+1").convertToDouble());
1316 EXPECT_EQ( 2048.0, APFloat(APFloat::IEEEdouble(), "0x1000p-1").convertToDouble());
1317 EXPECT_EQ(+2048.0, APFloat(APFloat::IEEEdouble(), "+0x1000p-1").convertToDouble());
1318 EXPECT_EQ(-2048.0, APFloat(APFloat::IEEEdouble(), "-0x1000p-1").convertToDouble());
1321 EXPECT_EQ( 16384.0, APFloat(APFloat::IEEEdouble(), "0x10p10").convertToDouble());
1322 EXPECT_EQ(+16384.0, APFloat(APFloat::IEEEdouble(), "+0x10p10").convertToDouble());
1323 EXPECT_EQ(-16384.0, APFloat(APFloat::IEEEdouble(), "-0x10p10").convertToDouble());
1325 EXPECT_EQ( 16384.0, APFloat(APFloat::IEEEdouble(), "0x10p+10").convertToDouble());
1326 EXPECT_EQ(+16384.0, APFloat(APFloat::IEEEdouble(), "+0x10p+10").convertToDouble());
1327 EXPECT_EQ(-16384.0, APFloat(APFloat::IEEEdouble(), "-0x10p+10").convertToDouble());
1329 EXPECT_EQ( 0.015625, APFloat(APFloat::IEEEdouble(), "0x10p-10").convertToDouble());
1330 EXPECT_EQ(+0.015625, APFloat(APFloat::IEEEdouble(), "+0x10p-10").convertToDouble());
1331 EXPECT_EQ(-0.015625, APFloat(APFloat::IEEEdouble(), "-0x10p-10").convertToDouble());
1333 EXPECT_EQ(1.0625, APFloat(APFloat::IEEEdouble(), "0x1.1p0").convertToDouble());
1334 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "0x1p0").convertToDouble());
1336 EXPECT_EQ(convertToDoubleFromString("0x1p-150"),
1337 convertToDoubleFromString("+0x800000000000000001.p-221"));
1338 EXPECT_EQ(2251799813685248.5,
1339 convertToDoubleFromString("0x80000000000004000000.010p-28"));
1342 TEST(APFloatTest
, toString
) {
1343 ASSERT_EQ("10", convertToString(10.0, 6, 3));
1344 ASSERT_EQ("1.0E+1", convertToString(10.0, 6, 0));
1345 ASSERT_EQ("10100", convertToString(1.01E+4, 5, 2));
1346 ASSERT_EQ("1.01E+4", convertToString(1.01E+4, 4, 2));
1347 ASSERT_EQ("1.01E+4", convertToString(1.01E+4, 5, 1));
1348 ASSERT_EQ("0.0101", convertToString(1.01E-2, 5, 2));
1349 ASSERT_EQ("0.0101", convertToString(1.01E-2, 4, 2));
1350 ASSERT_EQ("1.01E-2", convertToString(1.01E-2, 5, 1));
1351 ASSERT_EQ("0.78539816339744828", convertToString(0.78539816339744830961, 0, 3));
1352 ASSERT_EQ("4.9406564584124654E-324", convertToString(4.9406564584124654e-324, 0, 3));
1353 ASSERT_EQ("873.18340000000001", convertToString(873.1834, 0, 1));
1354 ASSERT_EQ("8.7318340000000001E+2", convertToString(873.1834, 0, 0));
1355 ASSERT_EQ("1.7976931348623157E+308", convertToString(1.7976931348623157E+308, 0, 0));
1356 ASSERT_EQ("10", convertToString(10.0, 6, 3, false));
1357 ASSERT_EQ("1.000000e+01", convertToString(10.0, 6, 0, false));
1358 ASSERT_EQ("10100", convertToString(1.01E+4, 5, 2, false));
1359 ASSERT_EQ("1.0100e+04", convertToString(1.01E+4, 4, 2, false));
1360 ASSERT_EQ("1.01000e+04", convertToString(1.01E+4, 5, 1, false));
1361 ASSERT_EQ("0.0101", convertToString(1.01E-2, 5, 2, false));
1362 ASSERT_EQ("0.0101", convertToString(1.01E-2, 4, 2, false));
1363 ASSERT_EQ("1.01000e-02", convertToString(1.01E-2, 5, 1, false));
1364 ASSERT_EQ("0.78539816339744828",
1365 convertToString(0.78539816339744830961, 0, 3, false));
1366 ASSERT_EQ("4.94065645841246540e-324",
1367 convertToString(4.9406564584124654e-324, 0, 3, false));
1368 ASSERT_EQ("873.18340000000001", convertToString(873.1834, 0, 1, false));
1369 ASSERT_EQ("8.73183400000000010e+02", convertToString(873.1834, 0, 0, false));
1370 ASSERT_EQ("1.79769313486231570e+308",
1371 convertToString(1.7976931348623157E+308, 0, 0, false));
1374 SmallString
<64> Str
;
1375 APFloat
UnnormalZero(APFloat::x87DoubleExtended(), APInt(80, {0, 1}));
1376 UnnormalZero
.toString(Str
);
1377 ASSERT_EQ("NaN", Str
);
1381 TEST(APFloatTest
, toInteger
) {
1382 bool isExact
= false;
1383 APSInt
result(5, /*isUnsigned=*/true);
1385 EXPECT_EQ(APFloat::opOK
,
1386 APFloat(APFloat::IEEEdouble(), "10")
1387 .convertToInteger(result
, APFloat::rmTowardZero
, &isExact
));
1388 EXPECT_TRUE(isExact
);
1389 EXPECT_EQ(APSInt(APInt(5, 10), true), result
);
1391 EXPECT_EQ(APFloat::opInvalidOp
,
1392 APFloat(APFloat::IEEEdouble(), "-10")
1393 .convertToInteger(result
, APFloat::rmTowardZero
, &isExact
));
1394 EXPECT_FALSE(isExact
);
1395 EXPECT_EQ(APSInt::getMinValue(5, true), result
);
1397 EXPECT_EQ(APFloat::opInvalidOp
,
1398 APFloat(APFloat::IEEEdouble(), "32")
1399 .convertToInteger(result
, APFloat::rmTowardZero
, &isExact
));
1400 EXPECT_FALSE(isExact
);
1401 EXPECT_EQ(APSInt::getMaxValue(5, true), result
);
1403 EXPECT_EQ(APFloat::opInexact
,
1404 APFloat(APFloat::IEEEdouble(), "7.9")
1405 .convertToInteger(result
, APFloat::rmTowardZero
, &isExact
));
1406 EXPECT_FALSE(isExact
);
1407 EXPECT_EQ(APSInt(APInt(5, 7), true), result
);
1409 result
.setIsUnsigned(false);
1410 EXPECT_EQ(APFloat::opOK
,
1411 APFloat(APFloat::IEEEdouble(), "-10")
1412 .convertToInteger(result
, APFloat::rmTowardZero
, &isExact
));
1413 EXPECT_TRUE(isExact
);
1414 EXPECT_EQ(APSInt(APInt(5, -10, true), false), result
);
1416 EXPECT_EQ(APFloat::opInvalidOp
,
1417 APFloat(APFloat::IEEEdouble(), "-17")
1418 .convertToInteger(result
, APFloat::rmTowardZero
, &isExact
));
1419 EXPECT_FALSE(isExact
);
1420 EXPECT_EQ(APSInt::getMinValue(5, false), result
);
1422 EXPECT_EQ(APFloat::opInvalidOp
,
1423 APFloat(APFloat::IEEEdouble(), "16")
1424 .convertToInteger(result
, APFloat::rmTowardZero
, &isExact
));
1425 EXPECT_FALSE(isExact
);
1426 EXPECT_EQ(APSInt::getMaxValue(5, false), result
);
1429 static APInt
nanbitsFromAPInt(const fltSemantics
&Sem
, bool SNaN
, bool Negative
,
1431 APInt
appayload(64, payload
);
1433 return APFloat::getSNaN(Sem
, Negative
, &appayload
).bitcastToAPInt();
1435 return APFloat::getQNaN(Sem
, Negative
, &appayload
).bitcastToAPInt();
1438 TEST(APFloatTest
, makeNaN
) {
1441 const fltSemantics
&semantics
;
1447 /* expected semantics SNaN Neg payload */
1448 { 0x7fc00000ULL
, APFloat::IEEEsingle(), false, false, 0x00000000ULL
},
1449 { 0xffc00000ULL
, APFloat::IEEEsingle(), false, true, 0x00000000ULL
},
1450 { 0x7fc0ae72ULL
, APFloat::IEEEsingle(), false, false, 0x0000ae72ULL
},
1451 { 0x7fffae72ULL
, APFloat::IEEEsingle(), false, false, 0xffffae72ULL
},
1452 { 0x7fdaae72ULL
, APFloat::IEEEsingle(), false, false, 0x00daae72ULL
},
1453 { 0x7fa00000ULL
, APFloat::IEEEsingle(), true, false, 0x00000000ULL
},
1454 { 0xffa00000ULL
, APFloat::IEEEsingle(), true, true, 0x00000000ULL
},
1455 { 0x7f80ae72ULL
, APFloat::IEEEsingle(), true, false, 0x0000ae72ULL
},
1456 { 0x7fbfae72ULL
, APFloat::IEEEsingle(), true, false, 0xffffae72ULL
},
1457 { 0x7f9aae72ULL
, APFloat::IEEEsingle(), true, false, 0x001aae72ULL
},
1458 { 0x7ff8000000000000ULL
, APFloat::IEEEdouble(), false, false, 0x0000000000000000ULL
},
1459 { 0xfff8000000000000ULL
, APFloat::IEEEdouble(), false, true, 0x0000000000000000ULL
},
1460 { 0x7ff800000000ae72ULL
, APFloat::IEEEdouble(), false, false, 0x000000000000ae72ULL
},
1461 { 0x7fffffffffffae72ULL
, APFloat::IEEEdouble(), false, false, 0xffffffffffffae72ULL
},
1462 { 0x7ffdaaaaaaaaae72ULL
, APFloat::IEEEdouble(), false, false, 0x000daaaaaaaaae72ULL
},
1463 { 0x7ff4000000000000ULL
, APFloat::IEEEdouble(), true, false, 0x0000000000000000ULL
},
1464 { 0xfff4000000000000ULL
, APFloat::IEEEdouble(), true, true, 0x0000000000000000ULL
},
1465 { 0x7ff000000000ae72ULL
, APFloat::IEEEdouble(), true, false, 0x000000000000ae72ULL
},
1466 { 0x7ff7ffffffffae72ULL
, APFloat::IEEEdouble(), true, false, 0xffffffffffffae72ULL
},
1467 { 0x7ff1aaaaaaaaae72ULL
, APFloat::IEEEdouble(), true, false, 0x0001aaaaaaaaae72ULL
},
1468 { 0x80ULL
, APFloat::Float8E5M2FNUZ(), false, false, 0xaaULL
},
1469 { 0x80ULL
, APFloat::Float8E5M2FNUZ(), false, true, 0xaaULL
},
1470 { 0x80ULL
, APFloat::Float8E5M2FNUZ(), true, false, 0xaaULL
},
1471 { 0x80ULL
, APFloat::Float8E5M2FNUZ(), true, true, 0xaaULL
},
1472 { 0x80ULL
, APFloat::Float8E4M3FNUZ(), false, false, 0xaaULL
},
1473 { 0x80ULL
, APFloat::Float8E4M3FNUZ(), false, true, 0xaaULL
},
1474 { 0x80ULL
, APFloat::Float8E4M3FNUZ(), true, false, 0xaaULL
},
1475 { 0x80ULL
, APFloat::Float8E4M3FNUZ(), true, true, 0xaaULL
},
1476 { 0x80ULL
, APFloat::Float8E4M3B11FNUZ(), false, false, 0xaaULL
},
1477 { 0x80ULL
, APFloat::Float8E4M3B11FNUZ(), false, true, 0xaaULL
},
1478 { 0x80ULL
, APFloat::Float8E4M3B11FNUZ(), true, false, 0xaaULL
},
1479 { 0x80ULL
, APFloat::Float8E4M3B11FNUZ(), true, true, 0xaaULL
},
1480 { 0x3fe00ULL
, APFloat::FloatTF32(), false, false, 0x00000000ULL
},
1481 { 0x7fe00ULL
, APFloat::FloatTF32(), false, true, 0x00000000ULL
},
1482 { 0x3feaaULL
, APFloat::FloatTF32(), false, false, 0xaaULL
},
1483 { 0x3ffaaULL
, APFloat::FloatTF32(), false, false, 0xdaaULL
},
1484 { 0x3ffaaULL
, APFloat::FloatTF32(), false, false, 0xfdaaULL
},
1485 { 0x3fd00ULL
, APFloat::FloatTF32(), true, false, 0x00000000ULL
},
1486 { 0x7fd00ULL
, APFloat::FloatTF32(), true, true, 0x00000000ULL
},
1487 { 0x3fcaaULL
, APFloat::FloatTF32(), true, false, 0xaaULL
},
1488 { 0x3fdaaULL
, APFloat::FloatTF32(), true, false, 0xfaaULL
},
1489 { 0x3fdaaULL
, APFloat::FloatTF32(), true, false, 0x1aaULL
},
1493 for (const auto &t
: tests
) {
1494 ASSERT_EQ(t
.expected
, nanbitsFromAPInt(t
.semantics
, t
.SNaN
, t
.Negative
, t
.payload
));
1498 #ifdef GTEST_HAS_DEATH_TEST
1500 TEST(APFloatTest
, SemanticsDeath
) {
1501 EXPECT_DEATH(APFloat(APFloat::IEEEquad(), 0).convertToDouble(),
1502 "Float semantics is not representable by IEEEdouble");
1503 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), 0).convertToFloat(),
1504 "Float semantics is not representable by IEEEsingle");
1509 TEST(APFloatTest
, StringDecimalError
) {
1510 EXPECT_EQ("Invalid string length", convertToErrorFromString(""));
1511 EXPECT_EQ("String has no digits", convertToErrorFromString("+"));
1512 EXPECT_EQ("String has no digits", convertToErrorFromString("-"));
1514 EXPECT_EQ("Invalid character in significand", convertToErrorFromString(StringRef("\0", 1)));
1515 EXPECT_EQ("Invalid character in significand", convertToErrorFromString(StringRef("1\0", 2)));
1516 EXPECT_EQ("Invalid character in significand", convertToErrorFromString(StringRef("1" "\0" "2", 3)));
1517 EXPECT_EQ("Invalid character in significand", convertToErrorFromString(StringRef("1" "\0" "2e1", 5)));
1518 EXPECT_EQ("Invalid character in exponent", convertToErrorFromString(StringRef("1e\0", 3)));
1519 EXPECT_EQ("Invalid character in exponent", convertToErrorFromString(StringRef("1e1\0", 4)));
1520 EXPECT_EQ("Invalid character in exponent", convertToErrorFromString(StringRef("1e1" "\0" "2", 5)));
1522 EXPECT_EQ("Invalid character in significand", convertToErrorFromString("1.0f"));
1524 EXPECT_EQ("String contains multiple dots", convertToErrorFromString(".."));
1525 EXPECT_EQ("String contains multiple dots", convertToErrorFromString("..0"));
1526 EXPECT_EQ("String contains multiple dots", convertToErrorFromString("1.0.0"));
1529 TEST(APFloatTest
, StringDecimalSignificandError
) {
1530 EXPECT_EQ("Significand has no digits", convertToErrorFromString( "."));
1531 EXPECT_EQ("Significand has no digits", convertToErrorFromString("+."));
1532 EXPECT_EQ("Significand has no digits", convertToErrorFromString("-."));
1535 EXPECT_EQ("Significand has no digits", convertToErrorFromString( "e"));
1536 EXPECT_EQ("Significand has no digits", convertToErrorFromString("+e"));
1537 EXPECT_EQ("Significand has no digits", convertToErrorFromString("-e"));
1539 EXPECT_EQ("Significand has no digits", convertToErrorFromString( "e1"));
1540 EXPECT_EQ("Significand has no digits", convertToErrorFromString("+e1"));
1541 EXPECT_EQ("Significand has no digits", convertToErrorFromString("-e1"));
1543 EXPECT_EQ("Significand has no digits", convertToErrorFromString( ".e1"));
1544 EXPECT_EQ("Significand has no digits", convertToErrorFromString("+.e1"));
1545 EXPECT_EQ("Significand has no digits", convertToErrorFromString("-.e1"));
1548 EXPECT_EQ("Significand has no digits", convertToErrorFromString( ".e"));
1549 EXPECT_EQ("Significand has no digits", convertToErrorFromString("+.e"));
1550 EXPECT_EQ("Significand has no digits", convertToErrorFromString("-.e"));
1553 TEST(APFloatTest
, StringHexadecimalError
) {
1554 EXPECT_EQ("Invalid string", convertToErrorFromString( "0x"));
1555 EXPECT_EQ("Invalid string", convertToErrorFromString("+0x"));
1556 EXPECT_EQ("Invalid string", convertToErrorFromString("-0x"));
1558 EXPECT_EQ("Hex strings require an exponent", convertToErrorFromString( "0x0"));
1559 EXPECT_EQ("Hex strings require an exponent", convertToErrorFromString("+0x0"));
1560 EXPECT_EQ("Hex strings require an exponent", convertToErrorFromString("-0x0"));
1562 EXPECT_EQ("Hex strings require an exponent", convertToErrorFromString( "0x0."));
1563 EXPECT_EQ("Hex strings require an exponent", convertToErrorFromString("+0x0."));
1564 EXPECT_EQ("Hex strings require an exponent", convertToErrorFromString("-0x0."));
1566 EXPECT_EQ("Hex strings require an exponent", convertToErrorFromString( "0x.0"));
1567 EXPECT_EQ("Hex strings require an exponent", convertToErrorFromString("+0x.0"));
1568 EXPECT_EQ("Hex strings require an exponent", convertToErrorFromString("-0x.0"));
1570 EXPECT_EQ("Hex strings require an exponent", convertToErrorFromString( "0x0.0"));
1571 EXPECT_EQ("Hex strings require an exponent", convertToErrorFromString("+0x0.0"));
1572 EXPECT_EQ("Hex strings require an exponent", convertToErrorFromString("-0x0.0"));
1574 EXPECT_EQ("Invalid character in significand", convertToErrorFromString(StringRef("0x\0", 3)));
1575 EXPECT_EQ("Invalid character in significand", convertToErrorFromString(StringRef("0x1\0", 4)));
1576 EXPECT_EQ("Invalid character in significand", convertToErrorFromString(StringRef("0x1" "\0" "2", 5)));
1577 EXPECT_EQ("Invalid character in significand", convertToErrorFromString(StringRef("0x1" "\0" "2p1", 7)));
1578 EXPECT_EQ("Invalid character in exponent", convertToErrorFromString(StringRef("0x1p\0", 5)));
1579 EXPECT_EQ("Invalid character in exponent", convertToErrorFromString(StringRef("0x1p1\0", 6)));
1580 EXPECT_EQ("Invalid character in exponent", convertToErrorFromString(StringRef("0x1p1" "\0" "2", 7)));
1582 EXPECT_EQ("Invalid character in exponent", convertToErrorFromString("0x1p0f"));
1584 EXPECT_EQ("String contains multiple dots", convertToErrorFromString("0x..p1"));
1585 EXPECT_EQ("String contains multiple dots", convertToErrorFromString("0x..0p1"));
1586 EXPECT_EQ("String contains multiple dots", convertToErrorFromString("0x1.0.0p1"));
1589 TEST(APFloatTest
, StringHexadecimalSignificandError
) {
1590 EXPECT_EQ("Significand has no digits", convertToErrorFromString( "0x."));
1591 EXPECT_EQ("Significand has no digits", convertToErrorFromString("+0x."));
1592 EXPECT_EQ("Significand has no digits", convertToErrorFromString("-0x."));
1594 EXPECT_EQ("Significand has no digits", convertToErrorFromString( "0xp"));
1595 EXPECT_EQ("Significand has no digits", convertToErrorFromString("+0xp"));
1596 EXPECT_EQ("Significand has no digits", convertToErrorFromString("-0xp"));
1598 EXPECT_EQ("Significand has no digits", convertToErrorFromString( "0xp+"));
1599 EXPECT_EQ("Significand has no digits", convertToErrorFromString("+0xp+"));
1600 EXPECT_EQ("Significand has no digits", convertToErrorFromString("-0xp+"));
1602 EXPECT_EQ("Significand has no digits", convertToErrorFromString( "0xp-"));
1603 EXPECT_EQ("Significand has no digits", convertToErrorFromString("+0xp-"));
1604 EXPECT_EQ("Significand has no digits", convertToErrorFromString("-0xp-"));
1607 EXPECT_EQ("Significand has no digits", convertToErrorFromString( "0x.p"));
1608 EXPECT_EQ("Significand has no digits", convertToErrorFromString("+0x.p"));
1609 EXPECT_EQ("Significand has no digits", convertToErrorFromString("-0x.p"));
1611 EXPECT_EQ("Significand has no digits", convertToErrorFromString( "0x.p+"));
1612 EXPECT_EQ("Significand has no digits", convertToErrorFromString("+0x.p+"));
1613 EXPECT_EQ("Significand has no digits", convertToErrorFromString("-0x.p+"));
1615 EXPECT_EQ("Significand has no digits", convertToErrorFromString( "0x.p-"));
1616 EXPECT_EQ("Significand has no digits", convertToErrorFromString("+0x.p-"));
1617 EXPECT_EQ("Significand has no digits", convertToErrorFromString("-0x.p-"));
1620 TEST(APFloatTest
, StringHexadecimalExponentError
) {
1621 EXPECT_EQ("Exponent has no digits", convertToErrorFromString( "0x1p"));
1622 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("+0x1p"));
1623 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("-0x1p"));
1625 EXPECT_EQ("Exponent has no digits", convertToErrorFromString( "0x1p+"));
1626 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("+0x1p+"));
1627 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("-0x1p+"));
1629 EXPECT_EQ("Exponent has no digits", convertToErrorFromString( "0x1p-"));
1630 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("+0x1p-"));
1631 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("-0x1p-"));
1634 EXPECT_EQ("Exponent has no digits", convertToErrorFromString( "0x1.p"));
1635 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("+0x1.p"));
1636 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("-0x1.p"));
1638 EXPECT_EQ("Exponent has no digits", convertToErrorFromString( "0x1.p+"));
1639 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("+0x1.p+"));
1640 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("-0x1.p+"));
1642 EXPECT_EQ("Exponent has no digits", convertToErrorFromString( "0x1.p-"));
1643 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("+0x1.p-"));
1644 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("-0x1.p-"));
1647 EXPECT_EQ("Exponent has no digits", convertToErrorFromString( "0x.1p"));
1648 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("+0x.1p"));
1649 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("-0x.1p"));
1651 EXPECT_EQ("Exponent has no digits", convertToErrorFromString( "0x.1p+"));
1652 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("+0x.1p+"));
1653 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("-0x.1p+"));
1655 EXPECT_EQ("Exponent has no digits", convertToErrorFromString( "0x.1p-"));
1656 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("+0x.1p-"));
1657 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("-0x.1p-"));
1660 EXPECT_EQ("Exponent has no digits", convertToErrorFromString( "0x1.1p"));
1661 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("+0x1.1p"));
1662 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("-0x1.1p"));
1664 EXPECT_EQ("Exponent has no digits", convertToErrorFromString( "0x1.1p+"));
1665 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("+0x1.1p+"));
1666 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("-0x1.1p+"));
1668 EXPECT_EQ("Exponent has no digits", convertToErrorFromString( "0x1.1p-"));
1669 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("+0x1.1p-"));
1670 EXPECT_EQ("Exponent has no digits", convertToErrorFromString("-0x1.1p-"));
1673 TEST(APFloatTest
, exactInverse
) {
1676 // Trivial operation.
1677 EXPECT_TRUE(APFloat(2.0).getExactInverse(&inv
));
1678 EXPECT_TRUE(inv
.bitwiseIsEqual(APFloat(0.5)));
1679 EXPECT_TRUE(APFloat(2.0f
).getExactInverse(&inv
));
1680 EXPECT_TRUE(inv
.bitwiseIsEqual(APFloat(0.5f
)));
1681 EXPECT_TRUE(APFloat(APFloat::IEEEquad(), "2.0").getExactInverse(&inv
));
1682 EXPECT_TRUE(inv
.bitwiseIsEqual(APFloat(APFloat::IEEEquad(), "0.5")));
1683 EXPECT_TRUE(APFloat(APFloat::PPCDoubleDouble(), "2.0").getExactInverse(&inv
));
1684 EXPECT_TRUE(inv
.bitwiseIsEqual(APFloat(APFloat::PPCDoubleDouble(), "0.5")));
1685 EXPECT_TRUE(APFloat(APFloat::x87DoubleExtended(), "2.0").getExactInverse(&inv
));
1686 EXPECT_TRUE(inv
.bitwiseIsEqual(APFloat(APFloat::x87DoubleExtended(), "0.5")));
1689 EXPECT_TRUE(APFloat(1.17549435e-38f
).getExactInverse(&inv
));
1690 EXPECT_TRUE(inv
.bitwiseIsEqual(APFloat(8.5070592e+37f
)));
1692 // Large float, inverse is a denormal.
1693 EXPECT_FALSE(APFloat(1.7014118e38f
).getExactInverse(nullptr));
1695 EXPECT_FALSE(APFloat(0.0).getExactInverse(nullptr));
1696 // Denormalized float
1697 EXPECT_FALSE(APFloat(1.40129846e-45f
).getExactInverse(nullptr));
1700 TEST(APFloatTest
, roundToIntegral
) {
1701 APFloat
T(-0.5), S(3.14), R(APFloat::getLargest(APFloat::IEEEdouble())), P(0.0);
1704 P
.roundToIntegral(APFloat::rmTowardZero
);
1705 EXPECT_EQ(-0.0, P
.convertToDouble());
1707 P
.roundToIntegral(APFloat::rmTowardNegative
);
1708 EXPECT_EQ(-1.0, P
.convertToDouble());
1710 P
.roundToIntegral(APFloat::rmTowardPositive
);
1711 EXPECT_EQ(-0.0, P
.convertToDouble());
1713 P
.roundToIntegral(APFloat::rmNearestTiesToEven
);
1714 EXPECT_EQ(-0.0, P
.convertToDouble());
1717 P
.roundToIntegral(APFloat::rmTowardZero
);
1718 EXPECT_EQ(3.0, P
.convertToDouble());
1720 P
.roundToIntegral(APFloat::rmTowardNegative
);
1721 EXPECT_EQ(3.0, P
.convertToDouble());
1723 P
.roundToIntegral(APFloat::rmTowardPositive
);
1724 EXPECT_EQ(4.0, P
.convertToDouble());
1726 P
.roundToIntegral(APFloat::rmNearestTiesToEven
);
1727 EXPECT_EQ(3.0, P
.convertToDouble());
1730 P
.roundToIntegral(APFloat::rmTowardZero
);
1731 EXPECT_EQ(R
.convertToDouble(), P
.convertToDouble());
1733 P
.roundToIntegral(APFloat::rmTowardNegative
);
1734 EXPECT_EQ(R
.convertToDouble(), P
.convertToDouble());
1736 P
.roundToIntegral(APFloat::rmTowardPositive
);
1737 EXPECT_EQ(R
.convertToDouble(), P
.convertToDouble());
1739 P
.roundToIntegral(APFloat::rmNearestTiesToEven
);
1740 EXPECT_EQ(R
.convertToDouble(), P
.convertToDouble());
1742 P
= APFloat::getZero(APFloat::IEEEdouble());
1743 P
.roundToIntegral(APFloat::rmTowardZero
);
1744 EXPECT_EQ(0.0, P
.convertToDouble());
1745 P
= APFloat::getZero(APFloat::IEEEdouble(), true);
1746 P
.roundToIntegral(APFloat::rmTowardZero
);
1747 EXPECT_EQ(-0.0, P
.convertToDouble());
1748 P
= APFloat::getNaN(APFloat::IEEEdouble());
1749 P
.roundToIntegral(APFloat::rmTowardZero
);
1750 EXPECT_TRUE(std::isnan(P
.convertToDouble()));
1751 P
= APFloat::getInf(APFloat::IEEEdouble());
1752 P
.roundToIntegral(APFloat::rmTowardZero
);
1753 EXPECT_TRUE(std::isinf(P
.convertToDouble()) && P
.convertToDouble() > 0.0);
1754 P
= APFloat::getInf(APFloat::IEEEdouble(), true);
1755 P
.roundToIntegral(APFloat::rmTowardZero
);
1756 EXPECT_TRUE(std::isinf(P
.convertToDouble()) && P
.convertToDouble() < 0.0);
1758 APFloat::opStatus St
;
1760 P
= APFloat::getNaN(APFloat::IEEEdouble());
1761 St
= P
.roundToIntegral(APFloat::rmTowardZero
);
1762 EXPECT_TRUE(P
.isNaN());
1763 EXPECT_FALSE(P
.isNegative());
1764 EXPECT_EQ(APFloat::opOK
, St
);
1766 P
= APFloat::getNaN(APFloat::IEEEdouble(), true);
1767 St
= P
.roundToIntegral(APFloat::rmTowardZero
);
1768 EXPECT_TRUE(P
.isNaN());
1769 EXPECT_TRUE(P
.isNegative());
1770 EXPECT_EQ(APFloat::opOK
, St
);
1772 P
= APFloat::getSNaN(APFloat::IEEEdouble());
1773 St
= P
.roundToIntegral(APFloat::rmTowardZero
);
1774 EXPECT_TRUE(P
.isNaN());
1775 EXPECT_FALSE(P
.isSignaling());
1776 EXPECT_FALSE(P
.isNegative());
1777 EXPECT_EQ(APFloat::opInvalidOp
, St
);
1779 P
= APFloat::getSNaN(APFloat::IEEEdouble(), true);
1780 St
= P
.roundToIntegral(APFloat::rmTowardZero
);
1781 EXPECT_TRUE(P
.isNaN());
1782 EXPECT_FALSE(P
.isSignaling());
1783 EXPECT_TRUE(P
.isNegative());
1784 EXPECT_EQ(APFloat::opInvalidOp
, St
);
1786 P
= APFloat::getInf(APFloat::IEEEdouble());
1787 St
= P
.roundToIntegral(APFloat::rmTowardZero
);
1788 EXPECT_TRUE(P
.isInfinity());
1789 EXPECT_FALSE(P
.isNegative());
1790 EXPECT_EQ(APFloat::opOK
, St
);
1792 P
= APFloat::getInf(APFloat::IEEEdouble(), true);
1793 St
= P
.roundToIntegral(APFloat::rmTowardZero
);
1794 EXPECT_TRUE(P
.isInfinity());
1795 EXPECT_TRUE(P
.isNegative());
1796 EXPECT_EQ(APFloat::opOK
, St
);
1798 P
= APFloat::getZero(APFloat::IEEEdouble(), false);
1799 St
= P
.roundToIntegral(APFloat::rmTowardZero
);
1800 EXPECT_TRUE(P
.isZero());
1801 EXPECT_FALSE(P
.isNegative());
1802 EXPECT_EQ(APFloat::opOK
, St
);
1804 P
= APFloat::getZero(APFloat::IEEEdouble(), false);
1805 St
= P
.roundToIntegral(APFloat::rmTowardNegative
);
1806 EXPECT_TRUE(P
.isZero());
1807 EXPECT_FALSE(P
.isNegative());
1808 EXPECT_EQ(APFloat::opOK
, St
);
1810 P
= APFloat::getZero(APFloat::IEEEdouble(), true);
1811 St
= P
.roundToIntegral(APFloat::rmTowardZero
);
1812 EXPECT_TRUE(P
.isZero());
1813 EXPECT_TRUE(P
.isNegative());
1814 EXPECT_EQ(APFloat::opOK
, St
);
1816 P
= APFloat::getZero(APFloat::IEEEdouble(), true);
1817 St
= P
.roundToIntegral(APFloat::rmTowardNegative
);
1818 EXPECT_TRUE(P
.isZero());
1819 EXPECT_TRUE(P
.isNegative());
1820 EXPECT_EQ(APFloat::opOK
, St
);
1822 P
= APFloat(1E-100);
1823 St
= P
.roundToIntegral(APFloat::rmTowardNegative
);
1824 EXPECT_TRUE(P
.isZero());
1825 EXPECT_FALSE(P
.isNegative());
1826 EXPECT_EQ(APFloat::opInexact
, St
);
1828 P
= APFloat(1E-100);
1829 St
= P
.roundToIntegral(APFloat::rmTowardPositive
);
1830 EXPECT_EQ(1.0, P
.convertToDouble());
1831 EXPECT_FALSE(P
.isNegative());
1832 EXPECT_EQ(APFloat::opInexact
, St
);
1834 P
= APFloat(-1E-100);
1835 St
= P
.roundToIntegral(APFloat::rmTowardNegative
);
1836 EXPECT_TRUE(P
.isNegative());
1837 EXPECT_EQ(-1.0, P
.convertToDouble());
1838 EXPECT_EQ(APFloat::opInexact
, St
);
1840 P
= APFloat(-1E-100);
1841 St
= P
.roundToIntegral(APFloat::rmTowardPositive
);
1842 EXPECT_TRUE(P
.isZero());
1843 EXPECT_TRUE(P
.isNegative());
1844 EXPECT_EQ(APFloat::opInexact
, St
);
1847 St
= P
.roundToIntegral(APFloat::rmTowardZero
);
1848 EXPECT_EQ(10.0, P
.convertToDouble());
1849 EXPECT_EQ(APFloat::opOK
, St
);
1852 St
= P
.roundToIntegral(APFloat::rmTowardZero
);
1853 EXPECT_EQ(10.0, P
.convertToDouble());
1854 EXPECT_EQ(APFloat::opInexact
, St
);
1857 St
= P
.roundToIntegral(APFloat::rmTowardPositive
);
1858 EXPECT_EQ(11.0, P
.convertToDouble());
1859 EXPECT_EQ(APFloat::opInexact
, St
);
1862 St
= P
.roundToIntegral(APFloat::rmTowardNegative
);
1863 EXPECT_EQ(10.0, P
.convertToDouble());
1864 EXPECT_EQ(APFloat::opInexact
, St
);
1867 St
= P
.roundToIntegral(APFloat::rmNearestTiesToAway
);
1868 EXPECT_EQ(11.0, P
.convertToDouble());
1869 EXPECT_EQ(APFloat::opInexact
, St
);
1872 St
= P
.roundToIntegral(APFloat::rmNearestTiesToEven
);
1873 EXPECT_EQ(10.0, P
.convertToDouble());
1874 EXPECT_EQ(APFloat::opInexact
, St
);
1877 TEST(APFloatTest
, isInteger
) {
1879 EXPECT_TRUE(T
.isInteger());
1880 T
= APFloat(3.14159);
1881 EXPECT_FALSE(T
.isInteger());
1882 T
= APFloat::getNaN(APFloat::IEEEdouble());
1883 EXPECT_FALSE(T
.isInteger());
1884 T
= APFloat::getInf(APFloat::IEEEdouble());
1885 EXPECT_FALSE(T
.isInteger());
1886 T
= APFloat::getInf(APFloat::IEEEdouble(), true);
1887 EXPECT_FALSE(T
.isInteger());
1888 T
= APFloat::getLargest(APFloat::IEEEdouble());
1889 EXPECT_TRUE(T
.isInteger());
1892 TEST(DoubleAPFloatTest
, isInteger
) {
1895 llvm::detail::DoubleAPFloat
T(APFloat::PPCDoubleDouble(), std::move(F1
),
1897 EXPECT_TRUE(T
.isInteger());
1898 APFloat
F3(3.14159);
1900 llvm::detail::DoubleAPFloat
T2(APFloat::PPCDoubleDouble(), std::move(F3
),
1902 EXPECT_FALSE(T2
.isInteger());
1904 APFloat
F6(3.14159);
1905 llvm::detail::DoubleAPFloat
T3(APFloat::PPCDoubleDouble(), std::move(F5
),
1907 EXPECT_FALSE(T3
.isInteger());
1910 TEST(APFloatTest
, getLargest
) {
1911 EXPECT_EQ(3.402823466e+38f
, APFloat::getLargest(APFloat::IEEEsingle()).convertToFloat());
1912 EXPECT_EQ(1.7976931348623158e+308, APFloat::getLargest(APFloat::IEEEdouble()).convertToDouble());
1913 EXPECT_EQ(448, APFloat::getLargest(APFloat::Float8E4M3FN()).convertToDouble());
1915 APFloat::getLargest(APFloat::Float8E4M3FNUZ()).convertToDouble());
1917 APFloat::getLargest(APFloat::Float8E5M2FNUZ()).convertToDouble());
1919 30, APFloat::getLargest(APFloat::Float8E4M3B11FNUZ()).convertToDouble());
1920 EXPECT_EQ(3.40116213421e+38f
,
1921 APFloat::getLargest(APFloat::FloatTF32()).convertToFloat());
1922 EXPECT_EQ(28, APFloat::getLargest(APFloat::Float6E3M2FN()).convertToDouble());
1924 APFloat::getLargest(APFloat::Float6E2M3FN()).convertToDouble());
1925 EXPECT_EQ(6, APFloat::getLargest(APFloat::Float4E2M1FN()).convertToDouble());
1928 TEST(APFloatTest
, getSmallest
) {
1929 APFloat test
= APFloat::getSmallest(APFloat::IEEEsingle(), false);
1930 APFloat expected
= APFloat(APFloat::IEEEsingle(), "0x0.000002p-126");
1931 EXPECT_FALSE(test
.isNegative());
1932 EXPECT_TRUE(test
.isFiniteNonZero());
1933 EXPECT_TRUE(test
.isDenormal());
1934 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
1936 test
= APFloat::getSmallest(APFloat::IEEEsingle(), true);
1937 expected
= APFloat(APFloat::IEEEsingle(), "-0x0.000002p-126");
1938 EXPECT_TRUE(test
.isNegative());
1939 EXPECT_TRUE(test
.isFiniteNonZero());
1940 EXPECT_TRUE(test
.isDenormal());
1941 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
1943 test
= APFloat::getSmallest(APFloat::IEEEquad(), false);
1944 expected
= APFloat(APFloat::IEEEquad(), "0x0.0000000000000000000000000001p-16382");
1945 EXPECT_FALSE(test
.isNegative());
1946 EXPECT_TRUE(test
.isFiniteNonZero());
1947 EXPECT_TRUE(test
.isDenormal());
1948 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
1950 test
= APFloat::getSmallest(APFloat::IEEEquad(), true);
1951 expected
= APFloat(APFloat::IEEEquad(), "-0x0.0000000000000000000000000001p-16382");
1952 EXPECT_TRUE(test
.isNegative());
1953 EXPECT_TRUE(test
.isFiniteNonZero());
1954 EXPECT_TRUE(test
.isDenormal());
1955 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
1957 test
= APFloat::getSmallest(APFloat::Float8E5M2FNUZ(), false);
1958 expected
= APFloat(APFloat::Float8E5M2FNUZ(), "0x0.4p-15");
1959 EXPECT_FALSE(test
.isNegative());
1960 EXPECT_TRUE(test
.isFiniteNonZero());
1961 EXPECT_TRUE(test
.isDenormal());
1962 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
1964 test
= APFloat::getSmallest(APFloat::Float8E4M3FNUZ(), false);
1965 expected
= APFloat(APFloat::Float8E4M3FNUZ(), "0x0.2p-7");
1966 EXPECT_FALSE(test
.isNegative());
1967 EXPECT_TRUE(test
.isFiniteNonZero());
1968 EXPECT_TRUE(test
.isDenormal());
1969 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
1971 test
= APFloat::getSmallest(APFloat::Float8E4M3B11FNUZ(), false);
1972 expected
= APFloat(APFloat::Float8E4M3B11FNUZ(), "0x0.2p-10");
1973 EXPECT_FALSE(test
.isNegative());
1974 EXPECT_TRUE(test
.isFiniteNonZero());
1975 EXPECT_TRUE(test
.isDenormal());
1976 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
1978 test
= APFloat::getSmallest(APFloat::FloatTF32(), true);
1979 expected
= APFloat(APFloat::FloatTF32(), "-0x0.004p-126");
1980 EXPECT_TRUE(test
.isNegative());
1981 EXPECT_TRUE(test
.isFiniteNonZero());
1982 EXPECT_TRUE(test
.isDenormal());
1983 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
1985 test
= APFloat::getSmallest(APFloat::Float6E3M2FN(), false);
1986 expected
= APFloat(APFloat::Float6E3M2FN(), "0x0.1p0");
1987 EXPECT_FALSE(test
.isNegative());
1988 EXPECT_TRUE(test
.isFiniteNonZero());
1989 EXPECT_TRUE(test
.isDenormal());
1990 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
1992 test
= APFloat::getSmallest(APFloat::Float6E2M3FN(), false);
1993 expected
= APFloat(APFloat::Float6E2M3FN(), "0x0.2p0");
1994 EXPECT_FALSE(test
.isNegative());
1995 EXPECT_TRUE(test
.isFiniteNonZero());
1996 EXPECT_TRUE(test
.isDenormal());
1997 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
1999 test
= APFloat::getSmallest(APFloat::Float4E2M1FN(), false);
2000 expected
= APFloat(APFloat::Float4E2M1FN(), "0x0.8p0");
2001 EXPECT_FALSE(test
.isNegative());
2002 EXPECT_TRUE(test
.isFiniteNonZero());
2003 EXPECT_TRUE(test
.isDenormal());
2004 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
2007 TEST(APFloatTest
, getSmallestNormalized
) {
2008 APFloat test
= APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false);
2009 APFloat expected
= APFloat(APFloat::IEEEsingle(), "0x1p-126");
2010 EXPECT_FALSE(test
.isNegative());
2011 EXPECT_TRUE(test
.isFiniteNonZero());
2012 EXPECT_FALSE(test
.isDenormal());
2013 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
2014 EXPECT_TRUE(test
.isSmallestNormalized());
2016 test
= APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true);
2017 expected
= APFloat(APFloat::IEEEsingle(), "-0x1p-126");
2018 EXPECT_TRUE(test
.isNegative());
2019 EXPECT_TRUE(test
.isFiniteNonZero());
2020 EXPECT_FALSE(test
.isDenormal());
2021 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
2022 EXPECT_TRUE(test
.isSmallestNormalized());
2024 test
= APFloat::getSmallestNormalized(APFloat::IEEEdouble(), false);
2025 expected
= APFloat(APFloat::IEEEdouble(), "0x1p-1022");
2026 EXPECT_FALSE(test
.isNegative());
2027 EXPECT_TRUE(test
.isFiniteNonZero());
2028 EXPECT_FALSE(test
.isDenormal());
2029 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
2030 EXPECT_TRUE(test
.isSmallestNormalized());
2032 test
= APFloat::getSmallestNormalized(APFloat::IEEEdouble(), true);
2033 expected
= APFloat(APFloat::IEEEdouble(), "-0x1p-1022");
2034 EXPECT_TRUE(test
.isNegative());
2035 EXPECT_TRUE(test
.isFiniteNonZero());
2036 EXPECT_FALSE(test
.isDenormal());
2037 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
2038 EXPECT_TRUE(test
.isSmallestNormalized());
2040 test
= APFloat::getSmallestNormalized(APFloat::IEEEquad(), false);
2041 expected
= APFloat(APFloat::IEEEquad(), "0x1p-16382");
2042 EXPECT_FALSE(test
.isNegative());
2043 EXPECT_TRUE(test
.isFiniteNonZero());
2044 EXPECT_FALSE(test
.isDenormal());
2045 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
2046 EXPECT_TRUE(test
.isSmallestNormalized());
2048 test
= APFloat::getSmallestNormalized(APFloat::IEEEquad(), true);
2049 expected
= APFloat(APFloat::IEEEquad(), "-0x1p-16382");
2050 EXPECT_TRUE(test
.isNegative());
2051 EXPECT_TRUE(test
.isFiniteNonZero());
2052 EXPECT_FALSE(test
.isDenormal());
2053 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
2054 EXPECT_TRUE(test
.isSmallestNormalized());
2056 test
= APFloat::getSmallestNormalized(APFloat::Float8E5M2FNUZ(), false);
2057 expected
= APFloat(APFloat::Float8E5M2FNUZ(), "0x1.0p-15");
2058 EXPECT_FALSE(test
.isNegative());
2059 EXPECT_TRUE(test
.isFiniteNonZero());
2060 EXPECT_FALSE(test
.isDenormal());
2061 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
2062 EXPECT_TRUE(test
.isSmallestNormalized());
2064 test
= APFloat::getSmallestNormalized(APFloat::Float8E4M3FNUZ(), false);
2065 expected
= APFloat(APFloat::Float8E4M3FNUZ(), "0x1.0p-7");
2066 EXPECT_FALSE(test
.isNegative());
2067 EXPECT_TRUE(test
.isFiniteNonZero());
2068 EXPECT_FALSE(test
.isDenormal());
2069 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
2070 EXPECT_TRUE(test
.isSmallestNormalized());
2072 test
= APFloat::getSmallestNormalized(APFloat::Float8E4M3B11FNUZ(), false);
2073 expected
= APFloat(APFloat::Float8E4M3B11FNUZ(), "0x1.0p-10");
2074 EXPECT_FALSE(test
.isNegative());
2075 EXPECT_TRUE(test
.isFiniteNonZero());
2076 EXPECT_FALSE(test
.isDenormal());
2077 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
2078 EXPECT_TRUE(test
.isSmallestNormalized());
2080 test
= APFloat::getSmallestNormalized(APFloat::FloatTF32(), false);
2081 expected
= APFloat(APFloat::FloatTF32(), "0x1p-126");
2082 EXPECT_FALSE(test
.isNegative());
2083 EXPECT_TRUE(test
.isFiniteNonZero());
2084 EXPECT_FALSE(test
.isDenormal());
2085 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
2086 EXPECT_TRUE(test
.isSmallestNormalized());
2087 test
= APFloat::getSmallestNormalized(APFloat::Float6E3M2FN(), false);
2088 expected
= APFloat(APFloat::Float6E3M2FN(), "0x1p-2");
2090 test
= APFloat::getSmallestNormalized(APFloat::Float4E2M1FN(), false);
2091 expected
= APFloat(APFloat::Float4E2M1FN(), "0x1p0");
2092 EXPECT_FALSE(test
.isNegative());
2093 EXPECT_TRUE(test
.isFiniteNonZero());
2094 EXPECT_FALSE(test
.isDenormal());
2095 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
2096 EXPECT_TRUE(test
.isSmallestNormalized());
2097 EXPECT_FALSE(test
.isNegative());
2098 EXPECT_TRUE(test
.isFiniteNonZero());
2099 EXPECT_FALSE(test
.isDenormal());
2100 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
2101 EXPECT_TRUE(test
.isSmallestNormalized());
2103 test
= APFloat::getSmallestNormalized(APFloat::Float6E2M3FN(), false);
2104 expected
= APFloat(APFloat::Float6E2M3FN(), "0x1p0");
2105 EXPECT_FALSE(test
.isNegative());
2106 EXPECT_TRUE(test
.isFiniteNonZero());
2107 EXPECT_FALSE(test
.isDenormal());
2108 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
2109 EXPECT_TRUE(test
.isSmallestNormalized());
2112 TEST(APFloatTest
, getZero
) {
2114 const fltSemantics
*semantics
;
2116 const bool signedZero
;
2117 const unsigned long long bitPattern
[2];
2118 const unsigned bitPatternLength
;
2119 } const GetZeroTest
[] = {
2120 {&APFloat::IEEEhalf(), false, true, {0, 0}, 1},
2121 {&APFloat::IEEEhalf(), true, true, {0x8000ULL
, 0}, 1},
2122 {&APFloat::IEEEsingle(), false, true, {0, 0}, 1},
2123 {&APFloat::IEEEsingle(), true, true, {0x80000000ULL
, 0}, 1},
2124 {&APFloat::IEEEdouble(), false, true, {0, 0}, 1},
2125 {&APFloat::IEEEdouble(), true, true, {0x8000000000000000ULL
, 0}, 1},
2126 {&APFloat::IEEEquad(), false, true, {0, 0}, 2},
2127 {&APFloat::IEEEquad(), true, true, {0, 0x8000000000000000ULL
}, 2},
2128 {&APFloat::PPCDoubleDouble(), false, true, {0, 0}, 2},
2129 {&APFloat::PPCDoubleDouble(), true, true, {0x8000000000000000ULL
, 0}, 2},
2130 {&APFloat::x87DoubleExtended(), false, true, {0, 0}, 2},
2131 {&APFloat::x87DoubleExtended(), true, true, {0, 0x8000ULL
}, 2},
2132 {&APFloat::Float8E5M2(), false, true, {0, 0}, 1},
2133 {&APFloat::Float8E5M2(), true, true, {0x80ULL
, 0}, 1},
2134 {&APFloat::Float8E5M2FNUZ(), false, false, {0, 0}, 1},
2135 {&APFloat::Float8E5M2FNUZ(), true, false, {0, 0}, 1},
2136 {&APFloat::Float8E4M3(), false, true, {0, 0}, 1},
2137 {&APFloat::Float8E4M3(), true, true, {0x80ULL
, 0}, 1},
2138 {&APFloat::Float8E4M3FN(), false, true, {0, 0}, 1},
2139 {&APFloat::Float8E4M3FN(), true, true, {0x80ULL
, 0}, 1},
2140 {&APFloat::Float8E4M3FNUZ(), false, false, {0, 0}, 1},
2141 {&APFloat::Float8E4M3FNUZ(), true, false, {0, 0}, 1},
2142 {&APFloat::Float8E4M3B11FNUZ(), false, false, {0, 0}, 1},
2143 {&APFloat::Float8E4M3B11FNUZ(), true, false, {0, 0}, 1},
2144 {&APFloat::FloatTF32(), false, true, {0, 0}, 1},
2145 {&APFloat::FloatTF32(), true, true, {0x40000ULL
, 0}, 1},
2146 {&APFloat::Float6E3M2FN(), false, true, {0, 0}, 1},
2147 {&APFloat::Float6E3M2FN(), true, true, {0x20ULL
, 0}, 1},
2148 {&APFloat::Float6E2M3FN(), false, true, {0, 0}, 1},
2149 {&APFloat::Float6E2M3FN(), true, true, {0x20ULL
, 0}, 1},
2150 {&APFloat::Float4E2M1FN(), false, true, {0, 0}, 1},
2151 {&APFloat::Float4E2M1FN(), true, true, {0x8ULL
, 0}, 1}};
2152 const unsigned NumGetZeroTests
= std::size(GetZeroTest
);
2153 for (unsigned i
= 0; i
< NumGetZeroTests
; ++i
) {
2154 APFloat test
= APFloat::getZero(*GetZeroTest
[i
].semantics
,
2155 GetZeroTest
[i
].sign
);
2156 const char *pattern
= GetZeroTest
[i
].sign
? "-0x0p+0" : "0x0p+0";
2157 APFloat expected
= APFloat(*GetZeroTest
[i
].semantics
,
2159 EXPECT_TRUE(test
.isZero());
2160 if (GetZeroTest
[i
].signedZero
)
2161 EXPECT_TRUE(GetZeroTest
[i
].sign
? test
.isNegative() : !test
.isNegative());
2163 EXPECT_TRUE(!test
.isNegative());
2164 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
2165 for (unsigned j
= 0, je
= GetZeroTest
[i
].bitPatternLength
; j
< je
; ++j
) {
2166 EXPECT_EQ(GetZeroTest
[i
].bitPattern
[j
],
2167 test
.bitcastToAPInt().getRawData()[j
]);
2172 TEST(APFloatTest
, copySign
) {
2173 EXPECT_TRUE(APFloat(-42.0).bitwiseIsEqual(
2174 APFloat::copySign(APFloat(42.0), APFloat(-1.0))));
2175 EXPECT_TRUE(APFloat(42.0).bitwiseIsEqual(
2176 APFloat::copySign(APFloat(-42.0), APFloat(1.0))));
2177 EXPECT_TRUE(APFloat(-42.0).bitwiseIsEqual(
2178 APFloat::copySign(APFloat(-42.0), APFloat(-1.0))));
2179 EXPECT_TRUE(APFloat(42.0).bitwiseIsEqual(
2180 APFloat::copySign(APFloat(42.0), APFloat(1.0))));
2181 // For floating-point formats with unsigned 0, copySign() to a zero is a noop
2182 for (APFloat::Semantics S
:
2183 {APFloat::S_Float8E4M3FNUZ
, APFloat::S_Float8E4M3B11FNUZ
}) {
2184 const llvm::fltSemantics
&Sem
= APFloat::EnumToSemantics(S
);
2185 EXPECT_TRUE(APFloat::getZero(Sem
).bitwiseIsEqual(
2186 APFloat::copySign(APFloat::getZero(Sem
), APFloat(-1.0))));
2187 EXPECT_TRUE(APFloat::getNaN(Sem
, true).bitwiseIsEqual(
2188 APFloat::copySign(APFloat::getNaN(Sem
, true), APFloat(1.0))));
2192 TEST(APFloatTest
, convert
) {
2194 APFloat
test(APFloat::IEEEdouble(), "1.0");
2195 test
.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven
, &losesInfo
);
2196 EXPECT_EQ(1.0f
, test
.convertToFloat());
2197 EXPECT_FALSE(losesInfo
);
2199 test
= APFloat(APFloat::x87DoubleExtended(), "0x1p-53");
2200 test
.add(APFloat(APFloat::x87DoubleExtended(), "1.0"), APFloat::rmNearestTiesToEven
);
2201 test
.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven
, &losesInfo
);
2202 EXPECT_EQ(1.0, test
.convertToDouble());
2203 EXPECT_TRUE(losesInfo
);
2205 test
= APFloat(APFloat::IEEEquad(), "0x1p-53");
2206 test
.add(APFloat(APFloat::IEEEquad(), "1.0"), APFloat::rmNearestTiesToEven
);
2207 test
.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven
, &losesInfo
);
2208 EXPECT_EQ(1.0, test
.convertToDouble());
2209 EXPECT_TRUE(losesInfo
);
2211 test
= APFloat(APFloat::x87DoubleExtended(), "0xf.fffffffp+28");
2212 test
.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven
, &losesInfo
);
2213 EXPECT_EQ(4294967295.0, test
.convertToDouble());
2214 EXPECT_FALSE(losesInfo
);
2216 test
= APFloat::getSNaN(APFloat::IEEEsingle());
2217 APFloat::opStatus status
= test
.convert(APFloat::x87DoubleExtended(), APFloat::rmNearestTiesToEven
, &losesInfo
);
2218 // Conversion quiets the SNAN, so now 2 bits of the 64-bit significand should be set.
2219 APInt
topTwoBits(64, 0x6000000000000000);
2220 EXPECT_TRUE(test
.bitwiseIsEqual(APFloat::getQNaN(APFloat::x87DoubleExtended(), false, &topTwoBits
)));
2221 EXPECT_FALSE(losesInfo
);
2222 EXPECT_EQ(status
, APFloat::opInvalidOp
);
2224 test
= APFloat::getQNaN(APFloat::IEEEsingle());
2225 APFloat X87QNaN
= APFloat::getQNaN(APFloat::x87DoubleExtended());
2226 test
.convert(APFloat::x87DoubleExtended(), APFloat::rmNearestTiesToEven
,
2228 EXPECT_TRUE(test
.bitwiseIsEqual(X87QNaN
));
2229 EXPECT_FALSE(losesInfo
);
2231 test
= APFloat::getSNaN(APFloat::x87DoubleExtended());
2232 test
.convert(APFloat::x87DoubleExtended(), APFloat::rmNearestTiesToEven
,
2234 APFloat X87SNaN
= APFloat::getSNaN(APFloat::x87DoubleExtended());
2235 EXPECT_TRUE(test
.bitwiseIsEqual(X87SNaN
));
2236 EXPECT_FALSE(losesInfo
);
2238 test
= APFloat::getQNaN(APFloat::x87DoubleExtended());
2239 test
.convert(APFloat::x87DoubleExtended(), APFloat::rmNearestTiesToEven
,
2241 EXPECT_TRUE(test
.bitwiseIsEqual(X87QNaN
));
2242 EXPECT_FALSE(losesInfo
);
2244 // The payload is lost in truncation, but we retain NaN by setting the quiet bit.
2245 APInt
payload(52, 1);
2246 test
= APFloat::getSNaN(APFloat::IEEEdouble(), false, &payload
);
2247 status
= test
.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven
, &losesInfo
);
2248 EXPECT_EQ(0x7fc00000, test
.bitcastToAPInt());
2249 EXPECT_TRUE(losesInfo
);
2250 EXPECT_EQ(status
, APFloat::opInvalidOp
);
2252 // The payload is lost in truncation. QNaN remains QNaN.
2253 test
= APFloat::getQNaN(APFloat::IEEEdouble(), false, &payload
);
2254 status
= test
.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven
, &losesInfo
);
2255 EXPECT_EQ(0x7fc00000, test
.bitcastToAPInt());
2256 EXPECT_TRUE(losesInfo
);
2257 EXPECT_EQ(status
, APFloat::opOK
);
2259 // Test that subnormals are handled correctly in double to float conversion
2260 test
= APFloat(APFloat::IEEEdouble(), "0x0.0000010000000p-1022");
2261 test
.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven
, &losesInfo
);
2262 EXPECT_EQ(0.0f
, test
.convertToFloat());
2263 EXPECT_TRUE(losesInfo
);
2265 test
= APFloat(APFloat::IEEEdouble(), "0x0.0000010000001p-1022");
2266 test
.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven
, &losesInfo
);
2267 EXPECT_EQ(0.0f
, test
.convertToFloat());
2268 EXPECT_TRUE(losesInfo
);
2270 test
= APFloat(APFloat::IEEEdouble(), "-0x0.0000010000001p-1022");
2271 test
.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven
, &losesInfo
);
2272 EXPECT_EQ(0.0f
, test
.convertToFloat());
2273 EXPECT_TRUE(losesInfo
);
2275 test
= APFloat(APFloat::IEEEdouble(), "0x0.0000020000000p-1022");
2276 test
.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven
, &losesInfo
);
2277 EXPECT_EQ(0.0f
, test
.convertToFloat());
2278 EXPECT_TRUE(losesInfo
);
2280 test
= APFloat(APFloat::IEEEdouble(), "0x0.0000020000001p-1022");
2281 test
.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven
, &losesInfo
);
2282 EXPECT_EQ(0.0f
, test
.convertToFloat());
2283 EXPECT_TRUE(losesInfo
);
2285 // Test subnormal conversion to bfloat
2286 test
= APFloat(APFloat::IEEEsingle(), "0x0.01p-126");
2287 test
.convert(APFloat::BFloat(), APFloat::rmNearestTiesToEven
, &losesInfo
);
2288 EXPECT_EQ(0.0f
, test
.convertToFloat());
2289 EXPECT_TRUE(losesInfo
);
2291 test
= APFloat(APFloat::IEEEsingle(), "0x0.02p-126");
2292 test
.convert(APFloat::BFloat(), APFloat::rmNearestTiesToEven
, &losesInfo
);
2293 EXPECT_EQ(0x01, test
.bitcastToAPInt());
2294 EXPECT_FALSE(losesInfo
);
2296 test
= APFloat(APFloat::IEEEsingle(), "0x0.01p-126");
2297 test
.convert(APFloat::BFloat(), APFloat::rmNearestTiesToAway
, &losesInfo
);
2298 EXPECT_EQ(0x01, test
.bitcastToAPInt());
2299 EXPECT_TRUE(losesInfo
);
2302 TEST(APFloatTest
, Float8UZConvert
) {
2303 bool losesInfo
= false;
2304 std::pair
<APFloat
, APFloat::opStatus
> toNaNTests
[] = {
2305 {APFloat::getQNaN(APFloat::IEEEsingle(), false), APFloat::opOK
},
2306 {APFloat::getQNaN(APFloat::IEEEsingle(), true), APFloat::opOK
},
2307 {APFloat::getSNaN(APFloat::IEEEsingle(), false), APFloat::opInvalidOp
},
2308 {APFloat::getSNaN(APFloat::IEEEsingle(), true), APFloat::opInvalidOp
},
2309 {APFloat::getInf(APFloat::IEEEsingle(), false), APFloat::opInexact
},
2310 {APFloat::getInf(APFloat::IEEEsingle(), true), APFloat::opInexact
}};
2311 for (APFloat::Semantics S
:
2312 {APFloat::S_Float8E5M2FNUZ
, APFloat::S_Float8E4M3FNUZ
,
2313 APFloat::S_Float8E4M3B11FNUZ
}) {
2314 const llvm::fltSemantics
&Sem
= APFloat::EnumToSemantics(S
);
2315 SCOPED_TRACE("Semantics = " + std::to_string(S
));
2316 for (auto [toTest
, expectedRes
] : toNaNTests
) {
2317 llvm::SmallString
<16> value
;
2318 toTest
.toString(value
);
2319 SCOPED_TRACE("toTest = " + value
);
2321 APFloat test
= toTest
;
2322 EXPECT_EQ(test
.convert(Sem
, APFloat::rmNearestTiesToAway
, &losesInfo
),
2324 EXPECT_TRUE(test
.isNaN());
2325 EXPECT_TRUE(test
.isNegative());
2326 EXPECT_FALSE(test
.isSignaling());
2327 EXPECT_FALSE(test
.isInfinity());
2328 EXPECT_EQ(0x80, test
.bitcastToAPInt());
2329 EXPECT_TRUE(losesInfo
);
2332 // Negative zero conversions are information losing.
2334 APFloat test
= APFloat::getZero(APFloat::IEEEsingle(), true);
2335 EXPECT_EQ(test
.convert(Sem
, APFloat::rmNearestTiesToAway
, &losesInfo
),
2336 APFloat::opInexact
);
2337 EXPECT_TRUE(test
.isZero());
2338 EXPECT_FALSE(test
.isNegative());
2339 EXPECT_TRUE(losesInfo
);
2340 EXPECT_EQ(0x0, test
.bitcastToAPInt());
2343 test
= APFloat::getZero(APFloat::IEEEsingle(), false);
2344 EXPECT_EQ(test
.convert(Sem
, APFloat::rmNearestTiesToAway
, &losesInfo
),
2346 EXPECT_TRUE(test
.isZero());
2347 EXPECT_FALSE(test
.isNegative());
2348 EXPECT_FALSE(losesInfo
);
2349 EXPECT_EQ(0x0, test
.bitcastToAPInt());
2351 // Except in casts between ourselves.
2353 test
= APFloat::getZero(Sem
);
2354 EXPECT_EQ(test
.convert(Sem
, APFloat::rmNearestTiesToAway
, &losesInfo
),
2356 EXPECT_FALSE(losesInfo
);
2357 EXPECT_EQ(0x0, test
.bitcastToAPInt());
2361 TEST(APFloatTest
, PPCDoubleDouble
) {
2362 APFloat
test(APFloat::PPCDoubleDouble(), "1.0");
2363 EXPECT_EQ(0x3ff0000000000000ull
, test
.bitcastToAPInt().getRawData()[0]);
2364 EXPECT_EQ(0x0000000000000000ull
, test
.bitcastToAPInt().getRawData()[1]);
2367 test
= APFloat(APFloat::PPCDoubleDouble(), "1.79769313486231580793728971405301e+308");
2368 EXPECT_EQ(0x7fefffffffffffffull
, test
.bitcastToAPInt().getRawData()[0]);
2369 EXPECT_EQ(0x7c8ffffffffffffeull
, test
.bitcastToAPInt().getRawData()[1]);
2372 test
= APFloat(APFloat::PPCDoubleDouble(), "2.00416836000897277799610805135016e-292");
2373 EXPECT_EQ(0x0360000000000000ull
, test
.bitcastToAPInt().getRawData()[0]);
2374 EXPECT_EQ(0x0000000000000000ull
, test
.bitcastToAPInt().getRawData()[1]);
2378 auto Result
= APFloat(APFloat::PPCDoubleDouble(), "1.0") +
2379 APFloat(APFloat::PPCDoubleDouble(), "1.0");
2380 EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result
.getSemantics());
2382 Result
= APFloat(APFloat::PPCDoubleDouble(), "1.0") -
2383 APFloat(APFloat::PPCDoubleDouble(), "1.0");
2384 EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result
.getSemantics());
2386 Result
= APFloat(APFloat::PPCDoubleDouble(), "1.0") *
2387 APFloat(APFloat::PPCDoubleDouble(), "1.0");
2388 EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result
.getSemantics());
2390 Result
= APFloat(APFloat::PPCDoubleDouble(), "1.0") /
2391 APFloat(APFloat::PPCDoubleDouble(), "1.0");
2392 EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result
.getSemantics());
2395 Result
= frexp(APFloat(APFloat::PPCDoubleDouble(), "1.0"), Exp
,
2396 APFloat::rmNearestTiesToEven
);
2397 EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result
.getSemantics());
2399 Result
= scalbn(APFloat(APFloat::PPCDoubleDouble(), "1.0"), 1,
2400 APFloat::rmNearestTiesToEven
);
2401 EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result
.getSemantics());
2405 TEST(APFloatTest
, isNegative
) {
2406 APFloat
t(APFloat::IEEEsingle(), "0x1p+0");
2407 EXPECT_FALSE(t
.isNegative());
2408 t
= APFloat(APFloat::IEEEsingle(), "-0x1p+0");
2409 EXPECT_TRUE(t
.isNegative());
2411 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), false).isNegative());
2412 EXPECT_TRUE(APFloat::getInf(APFloat::IEEEsingle(), true).isNegative());
2414 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), false).isNegative());
2415 EXPECT_TRUE(APFloat::getZero(APFloat::IEEEsingle(), true).isNegative());
2417 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), false).isNegative());
2418 EXPECT_TRUE(APFloat::getNaN(APFloat::IEEEsingle(), true).isNegative());
2420 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isNegative());
2421 EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle(), true).isNegative());
2424 TEST(APFloatTest
, isNormal
) {
2425 APFloat
t(APFloat::IEEEsingle(), "0x1p+0");
2426 EXPECT_TRUE(t
.isNormal());
2428 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), false).isNormal());
2429 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), false).isNormal());
2430 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), false).isNormal());
2431 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isNormal());
2432 EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), "0x1p-149").isNormal());
2435 TEST(APFloatTest
, isFinite
) {
2436 APFloat
t(APFloat::IEEEsingle(), "0x1p+0");
2437 EXPECT_TRUE(t
.isFinite());
2438 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), false).isFinite());
2439 EXPECT_TRUE(APFloat::getZero(APFloat::IEEEsingle(), false).isFinite());
2440 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), false).isFinite());
2441 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isFinite());
2442 EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "0x1p-149").isFinite());
2445 TEST(APFloatTest
, isInfinity
) {
2446 APFloat
t(APFloat::IEEEsingle(), "0x1p+0");
2447 EXPECT_FALSE(t
.isInfinity());
2449 APFloat PosInf
= APFloat::getInf(APFloat::IEEEsingle(), false);
2450 APFloat NegInf
= APFloat::getInf(APFloat::IEEEsingle(), true);
2452 EXPECT_TRUE(PosInf
.isInfinity());
2453 EXPECT_TRUE(PosInf
.isPosInfinity());
2454 EXPECT_FALSE(PosInf
.isNegInfinity());
2455 EXPECT_EQ(fcPosInf
, PosInf
.classify());
2457 EXPECT_TRUE(NegInf
.isInfinity());
2458 EXPECT_FALSE(NegInf
.isPosInfinity());
2459 EXPECT_TRUE(NegInf
.isNegInfinity());
2460 EXPECT_EQ(fcNegInf
, NegInf
.classify());
2462 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), false).isInfinity());
2463 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), false).isInfinity());
2464 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isInfinity());
2465 EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), "0x1p-149").isInfinity());
2468 TEST(APFloatTest
, isNaN
) {
2469 APFloat
t(APFloat::IEEEsingle(), "0x1p+0");
2470 EXPECT_FALSE(t
.isNaN());
2471 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), false).isNaN());
2472 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), false).isNaN());
2473 EXPECT_TRUE(APFloat::getNaN(APFloat::IEEEsingle(), false).isNaN());
2474 EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isNaN());
2475 EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), "0x1p-149").isNaN());
2478 TEST(APFloatTest
, isFiniteNonZero
) {
2479 // Test positive/negative normal value.
2480 EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "0x1p+0").isFiniteNonZero());
2481 EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "-0x1p+0").isFiniteNonZero());
2483 // Test positive/negative denormal value.
2484 EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "0x1p-149").isFiniteNonZero());
2485 EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "-0x1p-149").isFiniteNonZero());
2487 // Test +/- Infinity.
2488 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), false).isFiniteNonZero());
2489 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), true).isFiniteNonZero());
2492 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), false).isFiniteNonZero());
2493 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), true).isFiniteNonZero());
2495 // Test +/- qNaN. +/- dont mean anything with qNaN but paranoia can't hurt in
2497 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), false).isFiniteNonZero());
2498 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), true).isFiniteNonZero());
2500 // Test +/- sNaN. +/- dont mean anything with sNaN but paranoia can't hurt in
2502 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isFiniteNonZero());
2503 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), true).isFiniteNonZero());
2506 TEST(APFloatTest
, add
) {
2507 // Test Special Cases against each other and normal values.
2509 APFloat PInf
= APFloat::getInf(APFloat::IEEEsingle(), false);
2510 APFloat MInf
= APFloat::getInf(APFloat::IEEEsingle(), true);
2511 APFloat PZero
= APFloat::getZero(APFloat::IEEEsingle(), false);
2512 APFloat MZero
= APFloat::getZero(APFloat::IEEEsingle(), true);
2513 APFloat QNaN
= APFloat::getNaN(APFloat::IEEEsingle(), false);
2514 APFloat SNaN
= APFloat(APFloat::IEEEsingle(), "snan123");
2515 APFloat PNormalValue
= APFloat(APFloat::IEEEsingle(), "0x1p+0");
2516 APFloat MNormalValue
= APFloat(APFloat::IEEEsingle(), "-0x1p+0");
2517 APFloat PLargestValue
= APFloat::getLargest(APFloat::IEEEsingle(), false);
2518 APFloat MLargestValue
= APFloat::getLargest(APFloat::IEEEsingle(), true);
2519 APFloat PSmallestValue
= APFloat::getSmallest(APFloat::IEEEsingle(), false);
2520 APFloat MSmallestValue
= APFloat::getSmallest(APFloat::IEEEsingle(), true);
2521 APFloat PSmallestNormalized
=
2522 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false);
2523 APFloat MSmallestNormalized
=
2524 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true);
2526 const int OverflowStatus
= APFloat::opOverflow
| APFloat::opInexact
;
2534 } SpecialCaseTests
[] = {
2535 { PInf
, PInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2536 { PInf
, MInf
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
2537 { PInf
, PZero
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2538 { PInf
, MZero
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2539 { PInf
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2540 { PInf
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2541 { PInf
, PNormalValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2542 { PInf
, MNormalValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2543 { PInf
, PLargestValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2544 { PInf
, MLargestValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2545 { PInf
, PSmallestValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2546 { PInf
, MSmallestValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2547 { PInf
, PSmallestNormalized
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2548 { PInf
, MSmallestNormalized
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2549 { MInf
, PInf
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
2550 { MInf
, MInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2551 { MInf
, PZero
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2552 { MInf
, MZero
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2553 { MInf
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2554 { MInf
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2555 { MInf
, PNormalValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2556 { MInf
, MNormalValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2557 { MInf
, PLargestValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2558 { MInf
, MLargestValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2559 { MInf
, PSmallestValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2560 { MInf
, MSmallestValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2561 { MInf
, PSmallestNormalized
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2562 { MInf
, MSmallestNormalized
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2563 { PZero
, PInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2564 { PZero
, MInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2565 { PZero
, PZero
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2566 { PZero
, MZero
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2567 { PZero
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2568 { PZero
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2569 { PZero
, PNormalValue
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
2570 { PZero
, MNormalValue
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
2571 { PZero
, PLargestValue
, "0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
2572 { PZero
, MLargestValue
, "-0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
2573 { PZero
, PSmallestValue
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
2574 { PZero
, MSmallestValue
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
2575 { PZero
, PSmallestNormalized
, "0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
2576 { PZero
, MSmallestNormalized
, "-0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
2577 { MZero
, PInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2578 { MZero
, MInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2579 { MZero
, PZero
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2580 { MZero
, MZero
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2581 { MZero
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2582 { MZero
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2583 { MZero
, PNormalValue
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
2584 { MZero
, MNormalValue
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
2585 { MZero
, PLargestValue
, "0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
2586 { MZero
, MLargestValue
, "-0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
2587 { MZero
, PSmallestValue
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
2588 { MZero
, MSmallestValue
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
2589 { MZero
, PSmallestNormalized
, "0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
2590 { MZero
, MSmallestNormalized
, "-0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
2591 { QNaN
, PInf
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2592 { QNaN
, MInf
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2593 { QNaN
, PZero
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2594 { QNaN
, MZero
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2595 { QNaN
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2596 { QNaN
, SNaN
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
2597 { QNaN
, PNormalValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2598 { QNaN
, MNormalValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2599 { QNaN
, PLargestValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2600 { QNaN
, MLargestValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2601 { QNaN
, PSmallestValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2602 { QNaN
, MSmallestValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2603 { QNaN
, PSmallestNormalized
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2604 { QNaN
, MSmallestNormalized
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2605 { SNaN
, PInf
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2606 { SNaN
, MInf
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2607 { SNaN
, PZero
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2608 { SNaN
, MZero
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2609 { SNaN
, QNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2610 { SNaN
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2611 { SNaN
, PNormalValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2612 { SNaN
, MNormalValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2613 { SNaN
, PLargestValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2614 { SNaN
, MLargestValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2615 { SNaN
, PSmallestValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2616 { SNaN
, MSmallestValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2617 { SNaN
, PSmallestNormalized
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2618 { SNaN
, MSmallestNormalized
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2619 { PNormalValue
, PInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2620 { PNormalValue
, MInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2621 { PNormalValue
, PZero
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
2622 { PNormalValue
, MZero
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
2623 { PNormalValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2624 { PNormalValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2625 { PNormalValue
, PNormalValue
, "0x1p+1", APFloat::opOK
, APFloat::fcNormal
},
2626 { PNormalValue
, MNormalValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2627 { PNormalValue
, PLargestValue
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2628 { PNormalValue
, MLargestValue
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2629 { PNormalValue
, PSmallestValue
, "0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2630 { PNormalValue
, MSmallestValue
, "0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2631 { PNormalValue
, PSmallestNormalized
, "0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2632 { PNormalValue
, MSmallestNormalized
, "0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2633 { MNormalValue
, PInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2634 { MNormalValue
, MInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2635 { MNormalValue
, PZero
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
2636 { MNormalValue
, MZero
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
2637 { MNormalValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2638 { MNormalValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2639 { MNormalValue
, PNormalValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2640 { MNormalValue
, MNormalValue
, "-0x1p+1", APFloat::opOK
, APFloat::fcNormal
},
2641 { MNormalValue
, PLargestValue
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2642 { MNormalValue
, MLargestValue
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2643 { MNormalValue
, PSmallestValue
, "-0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2644 { MNormalValue
, MSmallestValue
, "-0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2645 { MNormalValue
, PSmallestNormalized
, "-0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2646 { MNormalValue
, MSmallestNormalized
, "-0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2647 { PLargestValue
, PInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2648 { PLargestValue
, MInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2649 { PLargestValue
, PZero
, "0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
2650 { PLargestValue
, MZero
, "0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
2651 { PLargestValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2652 { PLargestValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2653 { PLargestValue
, PNormalValue
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2654 { PLargestValue
, MNormalValue
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2655 { PLargestValue
, PLargestValue
, "inf", OverflowStatus
, APFloat::fcInfinity
},
2656 { PLargestValue
, MLargestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2657 { PLargestValue
, PSmallestValue
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2658 { PLargestValue
, MSmallestValue
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2659 { PLargestValue
, PSmallestNormalized
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2660 { PLargestValue
, MSmallestNormalized
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2661 { MLargestValue
, PInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2662 { MLargestValue
, MInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2663 { MLargestValue
, PZero
, "-0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
2664 { MLargestValue
, MZero
, "-0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
2665 { MLargestValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2666 { MLargestValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2667 { MLargestValue
, PNormalValue
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2668 { MLargestValue
, MNormalValue
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2669 { MLargestValue
, PLargestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2670 { MLargestValue
, MLargestValue
, "-inf", OverflowStatus
, APFloat::fcInfinity
},
2671 { MLargestValue
, PSmallestValue
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2672 { MLargestValue
, MSmallestValue
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2673 { MLargestValue
, PSmallestNormalized
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2674 { MLargestValue
, MSmallestNormalized
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2675 { PSmallestValue
, PInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2676 { PSmallestValue
, MInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2677 { PSmallestValue
, PZero
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
2678 { PSmallestValue
, MZero
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
2679 { PSmallestValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2680 { PSmallestValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2681 { PSmallestValue
, PNormalValue
, "0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2682 { PSmallestValue
, MNormalValue
, "-0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2683 { PSmallestValue
, PLargestValue
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2684 { PSmallestValue
, MLargestValue
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2685 { PSmallestValue
, PSmallestValue
, "0x1p-148", APFloat::opOK
, APFloat::fcNormal
},
2686 { PSmallestValue
, MSmallestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2687 { PSmallestValue
, PSmallestNormalized
, "0x1.000002p-126", APFloat::opOK
, APFloat::fcNormal
},
2688 { PSmallestValue
, MSmallestNormalized
, "-0x1.fffffcp-127", APFloat::opOK
, APFloat::fcNormal
},
2689 { MSmallestValue
, PInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2690 { MSmallestValue
, MInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2691 { MSmallestValue
, PZero
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
2692 { MSmallestValue
, MZero
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
2693 { MSmallestValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2694 { MSmallestValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2695 { MSmallestValue
, PNormalValue
, "0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2696 { MSmallestValue
, MNormalValue
, "-0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2697 { MSmallestValue
, PLargestValue
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2698 { MSmallestValue
, MLargestValue
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2699 { MSmallestValue
, PSmallestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2700 { MSmallestValue
, MSmallestValue
, "-0x1p-148", APFloat::opOK
, APFloat::fcNormal
},
2701 { MSmallestValue
, PSmallestNormalized
, "0x1.fffffcp-127", APFloat::opOK
, APFloat::fcNormal
},
2702 { MSmallestValue
, MSmallestNormalized
, "-0x1.000002p-126", APFloat::opOK
, APFloat::fcNormal
},
2703 { PSmallestNormalized
, PInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2704 { PSmallestNormalized
, MInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2705 { PSmallestNormalized
, PZero
, "0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
2706 { PSmallestNormalized
, MZero
, "0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
2707 { PSmallestNormalized
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2708 { PSmallestNormalized
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2709 { PSmallestNormalized
, PNormalValue
, "0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2710 { PSmallestNormalized
, MNormalValue
, "-0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2711 { PSmallestNormalized
, PLargestValue
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2712 { PSmallestNormalized
, MLargestValue
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2713 { PSmallestNormalized
, PSmallestValue
, "0x1.000002p-126", APFloat::opOK
, APFloat::fcNormal
},
2714 { PSmallestNormalized
, MSmallestValue
, "0x1.fffffcp-127", APFloat::opOK
, APFloat::fcNormal
},
2715 { PSmallestNormalized
, PSmallestNormalized
, "0x1p-125", APFloat::opOK
, APFloat::fcNormal
},
2716 { PSmallestNormalized
, MSmallestNormalized
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2717 { MSmallestNormalized
, PInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2718 { MSmallestNormalized
, MInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2719 { MSmallestNormalized
, PZero
, "-0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
2720 { MSmallestNormalized
, MZero
, "-0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
2721 { MSmallestNormalized
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2722 { MSmallestNormalized
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2723 { MSmallestNormalized
, PNormalValue
, "0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2724 { MSmallestNormalized
, MNormalValue
, "-0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2725 { MSmallestNormalized
, PLargestValue
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2726 { MSmallestNormalized
, MLargestValue
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2727 { MSmallestNormalized
, PSmallestValue
, "-0x1.fffffcp-127", APFloat::opOK
, APFloat::fcNormal
},
2728 { MSmallestNormalized
, MSmallestValue
, "-0x1.000002p-126", APFloat::opOK
, APFloat::fcNormal
},
2729 { MSmallestNormalized
, PSmallestNormalized
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2730 { MSmallestNormalized
, MSmallestNormalized
, "-0x1p-125", APFloat::opOK
, APFloat::fcNormal
}
2733 for (size_t i
= 0; i
< std::size(SpecialCaseTests
); ++i
) {
2734 APFloat
x(SpecialCaseTests
[i
].x
);
2735 APFloat
y(SpecialCaseTests
[i
].y
);
2736 APFloat::opStatus status
= x
.add(y
, APFloat::rmNearestTiesToEven
);
2738 APFloat
result(APFloat::IEEEsingle(), SpecialCaseTests
[i
].result
);
2740 EXPECT_TRUE(result
.bitwiseIsEqual(x
));
2741 EXPECT_EQ(SpecialCaseTests
[i
].status
, (int)status
);
2742 EXPECT_EQ(SpecialCaseTests
[i
].category
, (int)x
.getCategory());
2746 TEST(APFloatTest
, subtract
) {
2747 // Test Special Cases against each other and normal values.
2749 APFloat PInf
= APFloat::getInf(APFloat::IEEEsingle(), false);
2750 APFloat MInf
= APFloat::getInf(APFloat::IEEEsingle(), true);
2751 APFloat PZero
= APFloat::getZero(APFloat::IEEEsingle(), false);
2752 APFloat MZero
= APFloat::getZero(APFloat::IEEEsingle(), true);
2753 APFloat QNaN
= APFloat::getNaN(APFloat::IEEEsingle(), false);
2754 APFloat SNaN
= APFloat(APFloat::IEEEsingle(), "snan123");
2755 APFloat PNormalValue
= APFloat(APFloat::IEEEsingle(), "0x1p+0");
2756 APFloat MNormalValue
= APFloat(APFloat::IEEEsingle(), "-0x1p+0");
2757 APFloat PLargestValue
= APFloat::getLargest(APFloat::IEEEsingle(), false);
2758 APFloat MLargestValue
= APFloat::getLargest(APFloat::IEEEsingle(), true);
2759 APFloat PSmallestValue
= APFloat::getSmallest(APFloat::IEEEsingle(), false);
2760 APFloat MSmallestValue
= APFloat::getSmallest(APFloat::IEEEsingle(), true);
2761 APFloat PSmallestNormalized
=
2762 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false);
2763 APFloat MSmallestNormalized
=
2764 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true);
2766 const int OverflowStatus
= APFloat::opOverflow
| APFloat::opInexact
;
2774 } SpecialCaseTests
[] = {
2775 { PInf
, PInf
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
2776 { PInf
, MInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2777 { PInf
, PZero
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2778 { PInf
, MZero
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2779 { PInf
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2780 { PInf
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2781 { PInf
, PNormalValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2782 { PInf
, MNormalValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2783 { PInf
, PLargestValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2784 { PInf
, MLargestValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2785 { PInf
, PSmallestValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2786 { PInf
, MSmallestValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2787 { PInf
, PSmallestNormalized
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2788 { PInf
, MSmallestNormalized
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2789 { MInf
, PInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2790 { MInf
, MInf
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
2791 { MInf
, PZero
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2792 { MInf
, MZero
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2793 { MInf
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2794 { MInf
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2795 { MInf
, PNormalValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2796 { MInf
, MNormalValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2797 { MInf
, PLargestValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2798 { MInf
, MLargestValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2799 { MInf
, PSmallestValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2800 { MInf
, MSmallestValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2801 { MInf
, PSmallestNormalized
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2802 { MInf
, MSmallestNormalized
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2803 { PZero
, PInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2804 { PZero
, MInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2805 { PZero
, PZero
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2806 { PZero
, MZero
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2807 { PZero
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2808 { PZero
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2809 { PZero
, PNormalValue
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
2810 { PZero
, MNormalValue
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
2811 { PZero
, PLargestValue
, "-0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
2812 { PZero
, MLargestValue
, "0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
2813 { PZero
, PSmallestValue
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
2814 { PZero
, MSmallestValue
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
2815 { PZero
, PSmallestNormalized
, "-0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
2816 { PZero
, MSmallestNormalized
, "0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
2817 { MZero
, PInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2818 { MZero
, MInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2819 { MZero
, PZero
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2820 { MZero
, MZero
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2821 { MZero
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2822 { MZero
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2823 { MZero
, PNormalValue
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
2824 { MZero
, MNormalValue
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
2825 { MZero
, PLargestValue
, "-0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
2826 { MZero
, MLargestValue
, "0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
2827 { MZero
, PSmallestValue
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
2828 { MZero
, MSmallestValue
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
2829 { MZero
, PSmallestNormalized
, "-0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
2830 { MZero
, MSmallestNormalized
, "0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
2831 { QNaN
, PInf
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2832 { QNaN
, MInf
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2833 { QNaN
, PZero
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2834 { QNaN
, MZero
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2835 { QNaN
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2836 { QNaN
, SNaN
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
2837 { QNaN
, PNormalValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2838 { QNaN
, MNormalValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2839 { QNaN
, PLargestValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2840 { QNaN
, MLargestValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2841 { QNaN
, PSmallestValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2842 { QNaN
, MSmallestValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2843 { QNaN
, PSmallestNormalized
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2844 { QNaN
, MSmallestNormalized
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2845 { SNaN
, PInf
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2846 { SNaN
, MInf
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2847 { SNaN
, PZero
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2848 { SNaN
, MZero
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2849 { SNaN
, QNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2850 { SNaN
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2851 { SNaN
, PNormalValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2852 { SNaN
, MNormalValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2853 { SNaN
, PLargestValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2854 { SNaN
, MLargestValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2855 { SNaN
, PSmallestValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2856 { SNaN
, MSmallestValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2857 { SNaN
, PSmallestNormalized
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2858 { SNaN
, MSmallestNormalized
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2859 { PNormalValue
, PInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2860 { PNormalValue
, MInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2861 { PNormalValue
, PZero
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
2862 { PNormalValue
, MZero
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
2863 { PNormalValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2864 { PNormalValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2865 { PNormalValue
, PNormalValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2866 { PNormalValue
, MNormalValue
, "0x1p+1", APFloat::opOK
, APFloat::fcNormal
},
2867 { PNormalValue
, PLargestValue
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2868 { PNormalValue
, MLargestValue
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2869 { PNormalValue
, PSmallestValue
, "0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2870 { PNormalValue
, MSmallestValue
, "0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2871 { PNormalValue
, PSmallestNormalized
, "0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2872 { PNormalValue
, MSmallestNormalized
, "0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2873 { MNormalValue
, PInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2874 { MNormalValue
, MInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2875 { MNormalValue
, PZero
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
2876 { MNormalValue
, MZero
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
2877 { MNormalValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2878 { MNormalValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2879 { MNormalValue
, PNormalValue
, "-0x1p+1", APFloat::opOK
, APFloat::fcNormal
},
2880 { MNormalValue
, MNormalValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2881 { MNormalValue
, PLargestValue
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2882 { MNormalValue
, MLargestValue
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2883 { MNormalValue
, PSmallestValue
, "-0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2884 { MNormalValue
, MSmallestValue
, "-0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2885 { MNormalValue
, PSmallestNormalized
, "-0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2886 { MNormalValue
, MSmallestNormalized
, "-0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2887 { PLargestValue
, PInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2888 { PLargestValue
, MInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2889 { PLargestValue
, PZero
, "0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
2890 { PLargestValue
, MZero
, "0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
2891 { PLargestValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2892 { PLargestValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2893 { PLargestValue
, PNormalValue
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2894 { PLargestValue
, MNormalValue
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2895 { PLargestValue
, PLargestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2896 { PLargestValue
, MLargestValue
, "inf", OverflowStatus
, APFloat::fcInfinity
},
2897 { PLargestValue
, PSmallestValue
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2898 { PLargestValue
, MSmallestValue
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2899 { PLargestValue
, PSmallestNormalized
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2900 { PLargestValue
, MSmallestNormalized
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2901 { MLargestValue
, PInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2902 { MLargestValue
, MInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2903 { MLargestValue
, PZero
, "-0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
2904 { MLargestValue
, MZero
, "-0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
2905 { MLargestValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2906 { MLargestValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2907 { MLargestValue
, PNormalValue
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2908 { MLargestValue
, MNormalValue
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2909 { MLargestValue
, PLargestValue
, "-inf", OverflowStatus
, APFloat::fcInfinity
},
2910 { MLargestValue
, MLargestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2911 { MLargestValue
, PSmallestValue
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2912 { MLargestValue
, MSmallestValue
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2913 { MLargestValue
, PSmallestNormalized
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2914 { MLargestValue
, MSmallestNormalized
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2915 { PSmallestValue
, PInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2916 { PSmallestValue
, MInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2917 { PSmallestValue
, PZero
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
2918 { PSmallestValue
, MZero
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
2919 { PSmallestValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2920 { PSmallestValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2921 { PSmallestValue
, PNormalValue
, "-0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2922 { PSmallestValue
, MNormalValue
, "0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2923 { PSmallestValue
, PLargestValue
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2924 { PSmallestValue
, MLargestValue
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2925 { PSmallestValue
, PSmallestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2926 { PSmallestValue
, MSmallestValue
, "0x1p-148", APFloat::opOK
, APFloat::fcNormal
},
2927 { PSmallestValue
, PSmallestNormalized
, "-0x1.fffffcp-127", APFloat::opOK
, APFloat::fcNormal
},
2928 { PSmallestValue
, MSmallestNormalized
, "0x1.000002p-126", APFloat::opOK
, APFloat::fcNormal
},
2929 { MSmallestValue
, PInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2930 { MSmallestValue
, MInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2931 { MSmallestValue
, PZero
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
2932 { MSmallestValue
, MZero
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
2933 { MSmallestValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2934 { MSmallestValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2935 { MSmallestValue
, PNormalValue
, "-0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2936 { MSmallestValue
, MNormalValue
, "0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2937 { MSmallestValue
, PLargestValue
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2938 { MSmallestValue
, MLargestValue
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2939 { MSmallestValue
, PSmallestValue
, "-0x1p-148", APFloat::opOK
, APFloat::fcNormal
},
2940 { MSmallestValue
, MSmallestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2941 { MSmallestValue
, PSmallestNormalized
, "-0x1.000002p-126", APFloat::opOK
, APFloat::fcNormal
},
2942 { MSmallestValue
, MSmallestNormalized
, "0x1.fffffcp-127", APFloat::opOK
, APFloat::fcNormal
},
2943 { PSmallestNormalized
, PInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2944 { PSmallestNormalized
, MInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2945 { PSmallestNormalized
, PZero
, "0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
2946 { PSmallestNormalized
, MZero
, "0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
2947 { PSmallestNormalized
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2948 { PSmallestNormalized
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2949 { PSmallestNormalized
, PNormalValue
, "-0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2950 { PSmallestNormalized
, MNormalValue
, "0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2951 { PSmallestNormalized
, PLargestValue
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2952 { PSmallestNormalized
, MLargestValue
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2953 { PSmallestNormalized
, PSmallestValue
, "0x1.fffffcp-127", APFloat::opOK
, APFloat::fcNormal
},
2954 { PSmallestNormalized
, MSmallestValue
, "0x1.000002p-126", APFloat::opOK
, APFloat::fcNormal
},
2955 { PSmallestNormalized
, PSmallestNormalized
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
2956 { PSmallestNormalized
, MSmallestNormalized
, "0x1p-125", APFloat::opOK
, APFloat::fcNormal
},
2957 { MSmallestNormalized
, PInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
2958 { MSmallestNormalized
, MInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
2959 { MSmallestNormalized
, PZero
, "-0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
2960 { MSmallestNormalized
, MZero
, "-0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
2961 { MSmallestNormalized
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
2962 { MSmallestNormalized
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
2963 { MSmallestNormalized
, PNormalValue
, "-0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2964 { MSmallestNormalized
, MNormalValue
, "0x1p+0", APFloat::opInexact
, APFloat::fcNormal
},
2965 { MSmallestNormalized
, PLargestValue
, "-0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2966 { MSmallestNormalized
, MLargestValue
, "0x1.fffffep+127", APFloat::opInexact
, APFloat::fcNormal
},
2967 { MSmallestNormalized
, PSmallestValue
, "-0x1.000002p-126", APFloat::opOK
, APFloat::fcNormal
},
2968 { MSmallestNormalized
, MSmallestValue
, "-0x1.fffffcp-127", APFloat::opOK
, APFloat::fcNormal
},
2969 { MSmallestNormalized
, PSmallestNormalized
, "-0x1p-125", APFloat::opOK
, APFloat::fcNormal
},
2970 { MSmallestNormalized
, MSmallestNormalized
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
}
2973 for (size_t i
= 0; i
< std::size(SpecialCaseTests
); ++i
) {
2974 APFloat
x(SpecialCaseTests
[i
].x
);
2975 APFloat
y(SpecialCaseTests
[i
].y
);
2976 APFloat::opStatus status
= x
.subtract(y
, APFloat::rmNearestTiesToEven
);
2978 APFloat
result(APFloat::IEEEsingle(), SpecialCaseTests
[i
].result
);
2980 EXPECT_TRUE(result
.bitwiseIsEqual(x
));
2981 EXPECT_EQ(SpecialCaseTests
[i
].status
, (int)status
);
2982 EXPECT_EQ(SpecialCaseTests
[i
].category
, (int)x
.getCategory());
2986 TEST(APFloatTest
, multiply
) {
2987 // Test Special Cases against each other and normal values.
2989 APFloat PInf
= APFloat::getInf(APFloat::IEEEsingle(), false);
2990 APFloat MInf
= APFloat::getInf(APFloat::IEEEsingle(), true);
2991 APFloat PZero
= APFloat::getZero(APFloat::IEEEsingle(), false);
2992 APFloat MZero
= APFloat::getZero(APFloat::IEEEsingle(), true);
2993 APFloat QNaN
= APFloat::getNaN(APFloat::IEEEsingle(), false);
2994 APFloat SNaN
= APFloat(APFloat::IEEEsingle(), "snan123");
2995 APFloat PNormalValue
= APFloat(APFloat::IEEEsingle(), "0x1p+0");
2996 APFloat MNormalValue
= APFloat(APFloat::IEEEsingle(), "-0x1p+0");
2997 APFloat PLargestValue
= APFloat::getLargest(APFloat::IEEEsingle(), false);
2998 APFloat MLargestValue
= APFloat::getLargest(APFloat::IEEEsingle(), true);
2999 APFloat PSmallestValue
= APFloat::getSmallest(APFloat::IEEEsingle(), false);
3000 APFloat MSmallestValue
= APFloat::getSmallest(APFloat::IEEEsingle(), true);
3001 APFloat PSmallestNormalized
=
3002 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false);
3003 APFloat MSmallestNormalized
=
3004 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true);
3006 APFloat
MaxQuad(APFloat::IEEEquad(),
3007 "0x1.ffffffffffffffffffffffffffffp+16383");
3008 APFloat
MinQuad(APFloat::IEEEquad(),
3009 "0x0.0000000000000000000000000001p-16382");
3010 APFloat
NMinQuad(APFloat::IEEEquad(),
3011 "-0x0.0000000000000000000000000001p-16382");
3013 const int OverflowStatus
= APFloat::opOverflow
| APFloat::opInexact
;
3014 const int UnderflowStatus
= APFloat::opUnderflow
| APFloat::opInexact
;
3022 APFloat::roundingMode roundingMode
= APFloat::rmNearestTiesToEven
;
3023 } SpecialCaseTests
[] = {
3024 { PInf
, PInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3025 { PInf
, MInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3026 { PInf
, PZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
3027 { PInf
, MZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
3028 { PInf
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3029 { PInf
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3030 { PInf
, PNormalValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3031 { PInf
, MNormalValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3032 { PInf
, PLargestValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3033 { PInf
, MLargestValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3034 { PInf
, PSmallestValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3035 { PInf
, MSmallestValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3036 { PInf
, PSmallestNormalized
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3037 { PInf
, MSmallestNormalized
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3038 { MInf
, PInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3039 { MInf
, MInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3040 { MInf
, PZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
3041 { MInf
, MZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
3042 { MInf
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3043 { MInf
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3044 { MInf
, PNormalValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3045 { MInf
, MNormalValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3046 { MInf
, PLargestValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3047 { MInf
, MLargestValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3048 { MInf
, PSmallestValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3049 { MInf
, MSmallestValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3050 { MInf
, PSmallestNormalized
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3051 { MInf
, MSmallestNormalized
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3052 { PZero
, PInf
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
3053 { PZero
, MInf
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
3054 { PZero
, PZero
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3055 { PZero
, MZero
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3056 { PZero
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3057 { PZero
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3058 { PZero
, PNormalValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3059 { PZero
, MNormalValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3060 { PZero
, PLargestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3061 { PZero
, MLargestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3062 { PZero
, PSmallestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3063 { PZero
, MSmallestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3064 { PZero
, PSmallestNormalized
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3065 { PZero
, MSmallestNormalized
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3066 { MZero
, PInf
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
3067 { MZero
, MInf
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
3068 { MZero
, PZero
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3069 { MZero
, MZero
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3070 { MZero
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3071 { MZero
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3072 { MZero
, PNormalValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3073 { MZero
, MNormalValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3074 { MZero
, PLargestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3075 { MZero
, MLargestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3076 { MZero
, PSmallestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3077 { MZero
, MSmallestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3078 { MZero
, PSmallestNormalized
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3079 { MZero
, MSmallestNormalized
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3080 { QNaN
, PInf
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3081 { QNaN
, MInf
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3082 { QNaN
, PZero
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3083 { QNaN
, MZero
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3084 { QNaN
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3085 { QNaN
, SNaN
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
3086 { QNaN
, PNormalValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3087 { QNaN
, MNormalValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3088 { QNaN
, PLargestValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3089 { QNaN
, MLargestValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3090 { QNaN
, PSmallestValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3091 { QNaN
, MSmallestValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3092 { QNaN
, PSmallestNormalized
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3093 { QNaN
, MSmallestNormalized
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3094 { SNaN
, PInf
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3095 { SNaN
, MInf
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3096 { SNaN
, PZero
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3097 { SNaN
, MZero
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3098 { SNaN
, QNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3099 { SNaN
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3100 { SNaN
, PNormalValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3101 { SNaN
, MNormalValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3102 { SNaN
, PLargestValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3103 { SNaN
, MLargestValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3104 { SNaN
, PSmallestValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3105 { SNaN
, MSmallestValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3106 { SNaN
, PSmallestNormalized
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3107 { SNaN
, MSmallestNormalized
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3108 { PNormalValue
, PInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3109 { PNormalValue
, MInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3110 { PNormalValue
, PZero
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3111 { PNormalValue
, MZero
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3112 { PNormalValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3113 { PNormalValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3114 { PNormalValue
, PNormalValue
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
3115 { PNormalValue
, MNormalValue
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
3116 { PNormalValue
, PLargestValue
, "0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
3117 { PNormalValue
, MLargestValue
, "-0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
3118 { PNormalValue
, PSmallestValue
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
3119 { PNormalValue
, MSmallestValue
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
3120 { PNormalValue
, PSmallestNormalized
, "0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
3121 { PNormalValue
, MSmallestNormalized
, "-0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
3122 { MNormalValue
, PInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3123 { MNormalValue
, MInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3124 { MNormalValue
, PZero
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3125 { MNormalValue
, MZero
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3126 { MNormalValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3127 { MNormalValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3128 { MNormalValue
, PNormalValue
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
3129 { MNormalValue
, MNormalValue
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
3130 { MNormalValue
, PLargestValue
, "-0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
3131 { MNormalValue
, MLargestValue
, "0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
3132 { MNormalValue
, PSmallestValue
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
3133 { MNormalValue
, MSmallestValue
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
3134 { MNormalValue
, PSmallestNormalized
, "-0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
3135 { MNormalValue
, MSmallestNormalized
, "0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
3136 { PLargestValue
, PInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3137 { PLargestValue
, MInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3138 { PLargestValue
, PZero
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3139 { PLargestValue
, MZero
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3140 { PLargestValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3141 { PLargestValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3142 { PLargestValue
, PNormalValue
, "0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
3143 { PLargestValue
, MNormalValue
, "-0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
3144 { PLargestValue
, PLargestValue
, "inf", OverflowStatus
, APFloat::fcInfinity
},
3145 { PLargestValue
, MLargestValue
, "-inf", OverflowStatus
, APFloat::fcInfinity
},
3146 { PLargestValue
, PSmallestValue
, "0x1.fffffep-22", APFloat::opOK
, APFloat::fcNormal
},
3147 { PLargestValue
, MSmallestValue
, "-0x1.fffffep-22", APFloat::opOK
, APFloat::fcNormal
},
3148 { PLargestValue
, PSmallestNormalized
, "0x1.fffffep+1", APFloat::opOK
, APFloat::fcNormal
},
3149 { PLargestValue
, MSmallestNormalized
, "-0x1.fffffep+1", APFloat::opOK
, APFloat::fcNormal
},
3150 { MLargestValue
, PInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3151 { MLargestValue
, MInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3152 { MLargestValue
, PZero
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3153 { MLargestValue
, MZero
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3154 { MLargestValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3155 { MLargestValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3156 { MLargestValue
, PNormalValue
, "-0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
3157 { MLargestValue
, MNormalValue
, "0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
3158 { MLargestValue
, PLargestValue
, "-inf", OverflowStatus
, APFloat::fcInfinity
},
3159 { MLargestValue
, MLargestValue
, "inf", OverflowStatus
, APFloat::fcInfinity
},
3160 { MLargestValue
, PSmallestValue
, "-0x1.fffffep-22", APFloat::opOK
, APFloat::fcNormal
},
3161 { MLargestValue
, MSmallestValue
, "0x1.fffffep-22", APFloat::opOK
, APFloat::fcNormal
},
3162 { MLargestValue
, PSmallestNormalized
, "-0x1.fffffep+1", APFloat::opOK
, APFloat::fcNormal
},
3163 { MLargestValue
, MSmallestNormalized
, "0x1.fffffep+1", APFloat::opOK
, APFloat::fcNormal
},
3164 { PSmallestValue
, PInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3165 { PSmallestValue
, MInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3166 { PSmallestValue
, PZero
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3167 { PSmallestValue
, MZero
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3168 { PSmallestValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3169 { PSmallestValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3170 { PSmallestValue
, PNormalValue
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
3171 { PSmallestValue
, MNormalValue
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
3172 { PSmallestValue
, PLargestValue
, "0x1.fffffep-22", APFloat::opOK
, APFloat::fcNormal
},
3173 { PSmallestValue
, MLargestValue
, "-0x1.fffffep-22", APFloat::opOK
, APFloat::fcNormal
},
3174 { PSmallestValue
, PSmallestValue
, "0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3175 { PSmallestValue
, MSmallestValue
, "-0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3176 { PSmallestValue
, PSmallestNormalized
, "0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3177 { PSmallestValue
, MSmallestNormalized
, "-0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3178 { MSmallestValue
, PInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3179 { MSmallestValue
, MInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3180 { MSmallestValue
, PZero
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3181 { MSmallestValue
, MZero
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3182 { MSmallestValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3183 { MSmallestValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3184 { MSmallestValue
, PNormalValue
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
3185 { MSmallestValue
, MNormalValue
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
3186 { MSmallestValue
, PLargestValue
, "-0x1.fffffep-22", APFloat::opOK
, APFloat::fcNormal
},
3187 { MSmallestValue
, MLargestValue
, "0x1.fffffep-22", APFloat::opOK
, APFloat::fcNormal
},
3188 { MSmallestValue
, PSmallestValue
, "-0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3189 { MSmallestValue
, MSmallestValue
, "0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3190 { MSmallestValue
, PSmallestNormalized
, "-0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3191 { MSmallestValue
, MSmallestNormalized
, "0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3192 { PSmallestNormalized
, PInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3193 { PSmallestNormalized
, MInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3194 { PSmallestNormalized
, PZero
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3195 { PSmallestNormalized
, MZero
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3196 { PSmallestNormalized
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3197 { PSmallestNormalized
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3198 { PSmallestNormalized
, PNormalValue
, "0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
3199 { PSmallestNormalized
, MNormalValue
, "-0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
3200 { PSmallestNormalized
, PLargestValue
, "0x1.fffffep+1", APFloat::opOK
, APFloat::fcNormal
},
3201 { PSmallestNormalized
, MLargestValue
, "-0x1.fffffep+1", APFloat::opOK
, APFloat::fcNormal
},
3202 { PSmallestNormalized
, PSmallestValue
, "0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3203 { PSmallestNormalized
, MSmallestValue
, "-0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3204 { PSmallestNormalized
, PSmallestNormalized
, "0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3205 { PSmallestNormalized
, MSmallestNormalized
, "-0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3206 { MSmallestNormalized
, PInf
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3207 { MSmallestNormalized
, MInf
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3208 { MSmallestNormalized
, PZero
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3209 { MSmallestNormalized
, MZero
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3210 { MSmallestNormalized
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3211 { MSmallestNormalized
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3212 { MSmallestNormalized
, PNormalValue
, "-0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
3213 { MSmallestNormalized
, MNormalValue
, "0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
3214 { MSmallestNormalized
, PLargestValue
, "-0x1.fffffep+1", APFloat::opOK
, APFloat::fcNormal
},
3215 { MSmallestNormalized
, MLargestValue
, "0x1.fffffep+1", APFloat::opOK
, APFloat::fcNormal
},
3216 { MSmallestNormalized
, PSmallestValue
, "-0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3217 { MSmallestNormalized
, MSmallestValue
, "0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3218 { MSmallestNormalized
, PSmallestNormalized
, "-0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3219 { MSmallestNormalized
, MSmallestNormalized
, "0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3221 {MaxQuad
, MinQuad
, "0x1.ffffffffffffffffffffffffffffp-111", APFloat::opOK
,
3222 APFloat::fcNormal
, APFloat::rmNearestTiesToEven
},
3223 {MaxQuad
, MinQuad
, "0x1.ffffffffffffffffffffffffffffp-111", APFloat::opOK
,
3224 APFloat::fcNormal
, APFloat::rmTowardPositive
},
3225 {MaxQuad
, MinQuad
, "0x1.ffffffffffffffffffffffffffffp-111", APFloat::opOK
,
3226 APFloat::fcNormal
, APFloat::rmTowardNegative
},
3227 {MaxQuad
, MinQuad
, "0x1.ffffffffffffffffffffffffffffp-111", APFloat::opOK
,
3228 APFloat::fcNormal
, APFloat::rmTowardZero
},
3229 {MaxQuad
, MinQuad
, "0x1.ffffffffffffffffffffffffffffp-111", APFloat::opOK
,
3230 APFloat::fcNormal
, APFloat::rmNearestTiesToAway
},
3232 {MaxQuad
, NMinQuad
, "-0x1.ffffffffffffffffffffffffffffp-111", APFloat::opOK
,
3233 APFloat::fcNormal
, APFloat::rmNearestTiesToEven
},
3234 {MaxQuad
, NMinQuad
, "-0x1.ffffffffffffffffffffffffffffp-111", APFloat::opOK
,
3235 APFloat::fcNormal
, APFloat::rmTowardPositive
},
3236 {MaxQuad
, NMinQuad
, "-0x1.ffffffffffffffffffffffffffffp-111", APFloat::opOK
,
3237 APFloat::fcNormal
, APFloat::rmTowardNegative
},
3238 {MaxQuad
, NMinQuad
, "-0x1.ffffffffffffffffffffffffffffp-111", APFloat::opOK
,
3239 APFloat::fcNormal
, APFloat::rmTowardZero
},
3240 {MaxQuad
, NMinQuad
, "-0x1.ffffffffffffffffffffffffffffp-111", APFloat::opOK
,
3241 APFloat::fcNormal
, APFloat::rmNearestTiesToAway
},
3243 {MaxQuad
, MaxQuad
, "inf", OverflowStatus
, APFloat::fcInfinity
,
3244 APFloat::rmNearestTiesToEven
},
3245 {MaxQuad
, MaxQuad
, "inf", OverflowStatus
, APFloat::fcInfinity
,
3246 APFloat::rmTowardPositive
},
3247 {MaxQuad
, MaxQuad
, "0x1.ffffffffffffffffffffffffffffp+16383",
3248 APFloat::opInexact
, APFloat::fcNormal
, APFloat::rmTowardNegative
},
3249 {MaxQuad
, MaxQuad
, "0x1.ffffffffffffffffffffffffffffp+16383",
3250 APFloat::opInexact
, APFloat::fcNormal
, APFloat::rmTowardZero
},
3251 {MaxQuad
, MaxQuad
, "inf", OverflowStatus
, APFloat::fcInfinity
,
3252 APFloat::rmNearestTiesToAway
},
3254 {MinQuad
, MinQuad
, "0", UnderflowStatus
, APFloat::fcZero
,
3255 APFloat::rmNearestTiesToEven
},
3256 {MinQuad
, MinQuad
, "0x0.0000000000000000000000000001p-16382",
3257 UnderflowStatus
, APFloat::fcNormal
, APFloat::rmTowardPositive
},
3258 {MinQuad
, MinQuad
, "0", UnderflowStatus
, APFloat::fcZero
,
3259 APFloat::rmTowardNegative
},
3260 {MinQuad
, MinQuad
, "0", UnderflowStatus
, APFloat::fcZero
,
3261 APFloat::rmTowardZero
},
3262 {MinQuad
, MinQuad
, "0", UnderflowStatus
, APFloat::fcZero
,
3263 APFloat::rmNearestTiesToAway
},
3265 {MinQuad
, NMinQuad
, "-0", UnderflowStatus
, APFloat::fcZero
,
3266 APFloat::rmNearestTiesToEven
},
3267 {MinQuad
, NMinQuad
, "-0", UnderflowStatus
, APFloat::fcZero
,
3268 APFloat::rmTowardPositive
},
3269 {MinQuad
, NMinQuad
, "-0x0.0000000000000000000000000001p-16382",
3270 UnderflowStatus
, APFloat::fcNormal
, APFloat::rmTowardNegative
},
3271 {MinQuad
, NMinQuad
, "-0", UnderflowStatus
, APFloat::fcZero
,
3272 APFloat::rmTowardZero
},
3273 {MinQuad
, NMinQuad
, "-0", UnderflowStatus
, APFloat::fcZero
,
3274 APFloat::rmNearestTiesToAway
},
3277 for (size_t i
= 0; i
< std::size(SpecialCaseTests
); ++i
) {
3278 APFloat
x(SpecialCaseTests
[i
].x
);
3279 APFloat
y(SpecialCaseTests
[i
].y
);
3280 APFloat::opStatus status
= x
.multiply(y
, SpecialCaseTests
[i
].roundingMode
);
3282 APFloat
result(x
.getSemantics(), SpecialCaseTests
[i
].result
);
3284 EXPECT_TRUE(result
.bitwiseIsEqual(x
));
3285 EXPECT_EQ(SpecialCaseTests
[i
].status
, (int)status
);
3286 EXPECT_EQ(SpecialCaseTests
[i
].category
, (int)x
.getCategory());
3290 TEST(APFloatTest
, divide
) {
3291 // Test Special Cases against each other and normal values.
3293 APFloat PInf
= APFloat::getInf(APFloat::IEEEsingle(), false);
3294 APFloat MInf
= APFloat::getInf(APFloat::IEEEsingle(), true);
3295 APFloat PZero
= APFloat::getZero(APFloat::IEEEsingle(), false);
3296 APFloat MZero
= APFloat::getZero(APFloat::IEEEsingle(), true);
3297 APFloat QNaN
= APFloat::getNaN(APFloat::IEEEsingle(), false);
3298 APFloat SNaN
= APFloat(APFloat::IEEEsingle(), "snan123");
3299 APFloat PNormalValue
= APFloat(APFloat::IEEEsingle(), "0x1p+0");
3300 APFloat MNormalValue
= APFloat(APFloat::IEEEsingle(), "-0x1p+0");
3301 APFloat PLargestValue
= APFloat::getLargest(APFloat::IEEEsingle(), false);
3302 APFloat MLargestValue
= APFloat::getLargest(APFloat::IEEEsingle(), true);
3303 APFloat PSmallestValue
= APFloat::getSmallest(APFloat::IEEEsingle(), false);
3304 APFloat MSmallestValue
= APFloat::getSmallest(APFloat::IEEEsingle(), true);
3305 APFloat PSmallestNormalized
=
3306 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false);
3307 APFloat MSmallestNormalized
=
3308 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true);
3310 APFloat
MaxQuad(APFloat::IEEEquad(),
3311 "0x1.ffffffffffffffffffffffffffffp+16383");
3312 APFloat
MinQuad(APFloat::IEEEquad(),
3313 "0x0.0000000000000000000000000001p-16382");
3314 APFloat
NMinQuad(APFloat::IEEEquad(),
3315 "-0x0.0000000000000000000000000001p-16382");
3317 const int OverflowStatus
= APFloat::opOverflow
| APFloat::opInexact
;
3318 const int UnderflowStatus
= APFloat::opUnderflow
| APFloat::opInexact
;
3326 APFloat::roundingMode roundingMode
= APFloat::rmNearestTiesToEven
;
3327 } SpecialCaseTests
[] = {
3328 { PInf
, PInf
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
3329 { PInf
, MInf
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
3330 { PInf
, PZero
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3331 { PInf
, MZero
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3332 { PInf
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3333 { PInf
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3334 { PInf
, PNormalValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3335 { PInf
, MNormalValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3336 { PInf
, PLargestValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3337 { PInf
, MLargestValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3338 { PInf
, PSmallestValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3339 { PInf
, MSmallestValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3340 { PInf
, PSmallestNormalized
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3341 { PInf
, MSmallestNormalized
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3342 { MInf
, PInf
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
3343 { MInf
, MInf
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
3344 { MInf
, PZero
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3345 { MInf
, MZero
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3346 { MInf
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3347 { MInf
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3348 { MInf
, PNormalValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3349 { MInf
, MNormalValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3350 { MInf
, PLargestValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3351 { MInf
, MLargestValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3352 { MInf
, PSmallestValue
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3353 { MInf
, MSmallestValue
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3354 { MInf
, PSmallestNormalized
, "-inf", APFloat::opOK
, APFloat::fcInfinity
},
3355 { MInf
, MSmallestNormalized
, "inf", APFloat::opOK
, APFloat::fcInfinity
},
3356 { PZero
, PInf
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3357 { PZero
, MInf
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3358 { PZero
, PZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
3359 { PZero
, MZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
3360 { PZero
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3361 { PZero
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3362 { PZero
, PNormalValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3363 { PZero
, MNormalValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3364 { PZero
, PLargestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3365 { PZero
, MLargestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3366 { PZero
, PSmallestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3367 { PZero
, MSmallestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3368 { PZero
, PSmallestNormalized
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3369 { PZero
, MSmallestNormalized
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3370 { MZero
, PInf
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3371 { MZero
, MInf
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3372 { MZero
, PZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
3373 { MZero
, MZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
3374 { MZero
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3375 { MZero
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3376 { MZero
, PNormalValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3377 { MZero
, MNormalValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3378 { MZero
, PLargestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3379 { MZero
, MLargestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3380 { MZero
, PSmallestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3381 { MZero
, MSmallestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3382 { MZero
, PSmallestNormalized
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3383 { MZero
, MSmallestNormalized
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3384 { QNaN
, PInf
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3385 { QNaN
, MInf
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3386 { QNaN
, PZero
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3387 { QNaN
, MZero
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3388 { QNaN
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3389 { QNaN
, SNaN
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
3390 { QNaN
, PNormalValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3391 { QNaN
, MNormalValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3392 { QNaN
, PLargestValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3393 { QNaN
, MLargestValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3394 { QNaN
, PSmallestValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3395 { QNaN
, MSmallestValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3396 { QNaN
, PSmallestNormalized
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3397 { QNaN
, MSmallestNormalized
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3398 { SNaN
, PInf
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3399 { SNaN
, MInf
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3400 { SNaN
, PZero
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3401 { SNaN
, MZero
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3402 { SNaN
, QNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3403 { SNaN
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3404 { SNaN
, PNormalValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3405 { SNaN
, MNormalValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3406 { SNaN
, PLargestValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3407 { SNaN
, MLargestValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3408 { SNaN
, PSmallestValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3409 { SNaN
, MSmallestValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3410 { SNaN
, PSmallestNormalized
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3411 { SNaN
, MSmallestNormalized
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3412 { PNormalValue
, PInf
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3413 { PNormalValue
, MInf
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3414 { PNormalValue
, PZero
, "inf", APFloat::opDivByZero
, APFloat::fcInfinity
},
3415 { PNormalValue
, MZero
, "-inf", APFloat::opDivByZero
, APFloat::fcInfinity
},
3416 { PNormalValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3417 { PNormalValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3418 { PNormalValue
, PNormalValue
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
3419 { PNormalValue
, MNormalValue
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
3420 { PNormalValue
, PLargestValue
, "0x1p-128", UnderflowStatus
, APFloat::fcNormal
},
3421 { PNormalValue
, MLargestValue
, "-0x1p-128", UnderflowStatus
, APFloat::fcNormal
},
3422 { PNormalValue
, PSmallestValue
, "inf", OverflowStatus
, APFloat::fcInfinity
},
3423 { PNormalValue
, MSmallestValue
, "-inf", OverflowStatus
, APFloat::fcInfinity
},
3424 { PNormalValue
, PSmallestNormalized
, "0x1p+126", APFloat::opOK
, APFloat::fcNormal
},
3425 { PNormalValue
, MSmallestNormalized
, "-0x1p+126", APFloat::opOK
, APFloat::fcNormal
},
3426 { MNormalValue
, PInf
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3427 { MNormalValue
, MInf
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3428 { MNormalValue
, PZero
, "-inf", APFloat::opDivByZero
, APFloat::fcInfinity
},
3429 { MNormalValue
, MZero
, "inf", APFloat::opDivByZero
, APFloat::fcInfinity
},
3430 { MNormalValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3431 { MNormalValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3432 { MNormalValue
, PNormalValue
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
3433 { MNormalValue
, MNormalValue
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
3434 { MNormalValue
, PLargestValue
, "-0x1p-128", UnderflowStatus
, APFloat::fcNormal
},
3435 { MNormalValue
, MLargestValue
, "0x1p-128", UnderflowStatus
, APFloat::fcNormal
},
3436 { MNormalValue
, PSmallestValue
, "-inf", OverflowStatus
, APFloat::fcInfinity
},
3437 { MNormalValue
, MSmallestValue
, "inf", OverflowStatus
, APFloat::fcInfinity
},
3438 { MNormalValue
, PSmallestNormalized
, "-0x1p+126", APFloat::opOK
, APFloat::fcNormal
},
3439 { MNormalValue
, MSmallestNormalized
, "0x1p+126", APFloat::opOK
, APFloat::fcNormal
},
3440 { PLargestValue
, PInf
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3441 { PLargestValue
, MInf
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3442 { PLargestValue
, PZero
, "inf", APFloat::opDivByZero
, APFloat::fcInfinity
},
3443 { PLargestValue
, MZero
, "-inf", APFloat::opDivByZero
, APFloat::fcInfinity
},
3444 { PLargestValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3445 { PLargestValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3446 { PLargestValue
, PNormalValue
, "0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
3447 { PLargestValue
, MNormalValue
, "-0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
3448 { PLargestValue
, PLargestValue
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
3449 { PLargestValue
, MLargestValue
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
3450 { PLargestValue
, PSmallestValue
, "inf", OverflowStatus
, APFloat::fcInfinity
},
3451 { PLargestValue
, MSmallestValue
, "-inf", OverflowStatus
, APFloat::fcInfinity
},
3452 { PLargestValue
, PSmallestNormalized
, "inf", OverflowStatus
, APFloat::fcInfinity
},
3453 { PLargestValue
, MSmallestNormalized
, "-inf", OverflowStatus
, APFloat::fcInfinity
},
3454 { MLargestValue
, PInf
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3455 { MLargestValue
, MInf
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3456 { MLargestValue
, PZero
, "-inf", APFloat::opDivByZero
, APFloat::fcInfinity
},
3457 { MLargestValue
, MZero
, "inf", APFloat::opDivByZero
, APFloat::fcInfinity
},
3458 { MLargestValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3459 { MLargestValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3460 { MLargestValue
, PNormalValue
, "-0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
3461 { MLargestValue
, MNormalValue
, "0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
3462 { MLargestValue
, PLargestValue
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
3463 { MLargestValue
, MLargestValue
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
3464 { MLargestValue
, PSmallestValue
, "-inf", OverflowStatus
, APFloat::fcInfinity
},
3465 { MLargestValue
, MSmallestValue
, "inf", OverflowStatus
, APFloat::fcInfinity
},
3466 { MLargestValue
, PSmallestNormalized
, "-inf", OverflowStatus
, APFloat::fcInfinity
},
3467 { MLargestValue
, MSmallestNormalized
, "inf", OverflowStatus
, APFloat::fcInfinity
},
3468 { PSmallestValue
, PInf
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3469 { PSmallestValue
, MInf
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3470 { PSmallestValue
, PZero
, "inf", APFloat::opDivByZero
, APFloat::fcInfinity
},
3471 { PSmallestValue
, MZero
, "-inf", APFloat::opDivByZero
, APFloat::fcInfinity
},
3472 { PSmallestValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3473 { PSmallestValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3474 { PSmallestValue
, PNormalValue
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
3475 { PSmallestValue
, MNormalValue
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
3476 { PSmallestValue
, PLargestValue
, "0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3477 { PSmallestValue
, MLargestValue
, "-0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3478 { PSmallestValue
, PSmallestValue
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
3479 { PSmallestValue
, MSmallestValue
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
3480 { PSmallestValue
, PSmallestNormalized
, "0x1p-23", APFloat::opOK
, APFloat::fcNormal
},
3481 { PSmallestValue
, MSmallestNormalized
, "-0x1p-23", APFloat::opOK
, APFloat::fcNormal
},
3482 { MSmallestValue
, PInf
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3483 { MSmallestValue
, MInf
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3484 { MSmallestValue
, PZero
, "-inf", APFloat::opDivByZero
, APFloat::fcInfinity
},
3485 { MSmallestValue
, MZero
, "inf", APFloat::opDivByZero
, APFloat::fcInfinity
},
3486 { MSmallestValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3487 { MSmallestValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3488 { MSmallestValue
, PNormalValue
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
3489 { MSmallestValue
, MNormalValue
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
3490 { MSmallestValue
, PLargestValue
, "-0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3491 { MSmallestValue
, MLargestValue
, "0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3492 { MSmallestValue
, PSmallestValue
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
3493 { MSmallestValue
, MSmallestValue
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
3494 { MSmallestValue
, PSmallestNormalized
, "-0x1p-23", APFloat::opOK
, APFloat::fcNormal
},
3495 { MSmallestValue
, MSmallestNormalized
, "0x1p-23", APFloat::opOK
, APFloat::fcNormal
},
3496 { PSmallestNormalized
, PInf
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3497 { PSmallestNormalized
, MInf
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3498 { PSmallestNormalized
, PZero
, "inf", APFloat::opDivByZero
, APFloat::fcInfinity
},
3499 { PSmallestNormalized
, MZero
, "-inf", APFloat::opDivByZero
, APFloat::fcInfinity
},
3500 { PSmallestNormalized
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3501 { PSmallestNormalized
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3502 { PSmallestNormalized
, PNormalValue
, "0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
3503 { PSmallestNormalized
, MNormalValue
, "-0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
3504 { PSmallestNormalized
, PLargestValue
, "0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3505 { PSmallestNormalized
, MLargestValue
, "-0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3506 { PSmallestNormalized
, PSmallestValue
, "0x1p+23", APFloat::opOK
, APFloat::fcNormal
},
3507 { PSmallestNormalized
, MSmallestValue
, "-0x1p+23", APFloat::opOK
, APFloat::fcNormal
},
3508 { PSmallestNormalized
, PSmallestNormalized
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
3509 { PSmallestNormalized
, MSmallestNormalized
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
3510 { MSmallestNormalized
, PInf
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3511 { MSmallestNormalized
, MInf
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
3512 { MSmallestNormalized
, PZero
, "-inf", APFloat::opDivByZero
, APFloat::fcInfinity
},
3513 { MSmallestNormalized
, MZero
, "inf", APFloat::opDivByZero
, APFloat::fcInfinity
},
3514 { MSmallestNormalized
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
3515 { MSmallestNormalized
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
3516 { MSmallestNormalized
, PNormalValue
, "-0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
3517 { MSmallestNormalized
, MNormalValue
, "0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
3518 { MSmallestNormalized
, PLargestValue
, "-0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3519 { MSmallestNormalized
, MLargestValue
, "0x0p+0", UnderflowStatus
, APFloat::fcZero
},
3520 { MSmallestNormalized
, PSmallestValue
, "-0x1p+23", APFloat::opOK
, APFloat::fcNormal
},
3521 { MSmallestNormalized
, MSmallestValue
, "0x1p+23", APFloat::opOK
, APFloat::fcNormal
},
3522 { MSmallestNormalized
, PSmallestNormalized
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
3523 { MSmallestNormalized
, MSmallestNormalized
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
3525 {MaxQuad
, NMinQuad
, "-inf", OverflowStatus
, APFloat::fcInfinity
,
3526 APFloat::rmNearestTiesToEven
},
3527 {MaxQuad
, NMinQuad
, "-0x1.ffffffffffffffffffffffffffffp+16383",
3528 APFloat::opInexact
, APFloat::fcNormal
, APFloat::rmTowardPositive
},
3529 {MaxQuad
, NMinQuad
, "-inf", OverflowStatus
, APFloat::fcInfinity
,
3530 APFloat::rmTowardNegative
},
3531 {MaxQuad
, NMinQuad
, "-0x1.ffffffffffffffffffffffffffffp+16383",
3532 APFloat::opInexact
, APFloat::fcNormal
, APFloat::rmTowardZero
},
3533 {MaxQuad
, NMinQuad
, "-inf", OverflowStatus
, APFloat::fcInfinity
,
3534 APFloat::rmNearestTiesToAway
},
3536 {MinQuad
, MaxQuad
, "0", UnderflowStatus
, APFloat::fcZero
,
3537 APFloat::rmNearestTiesToEven
},
3538 {MinQuad
, MaxQuad
, "0x0.0000000000000000000000000001p-16382",
3539 UnderflowStatus
, APFloat::fcNormal
, APFloat::rmTowardPositive
},
3540 {MinQuad
, MaxQuad
, "0", UnderflowStatus
, APFloat::fcZero
,
3541 APFloat::rmTowardNegative
},
3542 {MinQuad
, MaxQuad
, "0", UnderflowStatus
, APFloat::fcZero
,
3543 APFloat::rmTowardZero
},
3544 {MinQuad
, MaxQuad
, "0", UnderflowStatus
, APFloat::fcZero
,
3545 APFloat::rmNearestTiesToAway
},
3547 {NMinQuad
, MaxQuad
, "-0", UnderflowStatus
, APFloat::fcZero
,
3548 APFloat::rmNearestTiesToEven
},
3549 {NMinQuad
, MaxQuad
, "-0", UnderflowStatus
, APFloat::fcZero
,
3550 APFloat::rmTowardPositive
},
3551 {NMinQuad
, MaxQuad
, "-0x0.0000000000000000000000000001p-16382",
3552 UnderflowStatus
, APFloat::fcNormal
, APFloat::rmTowardNegative
},
3553 {NMinQuad
, MaxQuad
, "-0", UnderflowStatus
, APFloat::fcZero
,
3554 APFloat::rmTowardZero
},
3555 {NMinQuad
, MaxQuad
, "-0", UnderflowStatus
, APFloat::fcZero
,
3556 APFloat::rmNearestTiesToAway
},
3559 for (size_t i
= 0; i
< std::size(SpecialCaseTests
); ++i
) {
3560 APFloat
x(SpecialCaseTests
[i
].x
);
3561 APFloat
y(SpecialCaseTests
[i
].y
);
3562 APFloat::opStatus status
= x
.divide(y
, SpecialCaseTests
[i
].roundingMode
);
3564 APFloat
result(x
.getSemantics(), SpecialCaseTests
[i
].result
);
3566 EXPECT_TRUE(result
.bitwiseIsEqual(x
));
3567 EXPECT_EQ(SpecialCaseTests
[i
].status
, (int)status
);
3568 EXPECT_EQ(SpecialCaseTests
[i
].category
, (int)x
.getCategory());
3572 TEST(APFloatTest
, operatorOverloads
) {
3573 // This is mostly testing that these operator overloads compile.
3574 APFloat One
= APFloat(APFloat::IEEEsingle(), "0x1p+0");
3575 APFloat Two
= APFloat(APFloat::IEEEsingle(), "0x2p+0");
3576 EXPECT_TRUE(Two
.bitwiseIsEqual(One
+ One
));
3577 EXPECT_TRUE(One
.bitwiseIsEqual(Two
- One
));
3578 EXPECT_TRUE(Two
.bitwiseIsEqual(One
* Two
));
3579 EXPECT_TRUE(One
.bitwiseIsEqual(Two
/ Two
));
3582 TEST(APFloatTest
, Comparisons
) {
3583 enum {MNan
, MInf
, MBig
, MOne
, MZer
, PZer
, POne
, PBig
, PInf
, PNan
, NumVals
};
3584 APFloat Vals
[NumVals
] = {
3585 APFloat::getNaN(APFloat::IEEEsingle(), true),
3586 APFloat::getInf(APFloat::IEEEsingle(), true),
3587 APFloat::getLargest(APFloat::IEEEsingle(), true),
3588 APFloat(APFloat::IEEEsingle(), "-0x1p+0"),
3589 APFloat::getZero(APFloat::IEEEsingle(), true),
3590 APFloat::getZero(APFloat::IEEEsingle(), false),
3591 APFloat(APFloat::IEEEsingle(), "0x1p+0"),
3592 APFloat::getLargest(APFloat::IEEEsingle(), false),
3593 APFloat::getInf(APFloat::IEEEsingle(), false),
3594 APFloat::getNaN(APFloat::IEEEsingle(), false),
3596 using Relation
= void (*)(const APFloat
&, const APFloat
&);
3597 Relation LT
= [](const APFloat
&LHS
, const APFloat
&RHS
) {
3598 EXPECT_FALSE(LHS
== RHS
);
3599 EXPECT_TRUE(LHS
!= RHS
);
3600 EXPECT_TRUE(LHS
< RHS
);
3601 EXPECT_FALSE(LHS
> RHS
);
3602 EXPECT_TRUE(LHS
<= RHS
);
3603 EXPECT_FALSE(LHS
>= RHS
);
3605 Relation EQ
= [](const APFloat
&LHS
, const APFloat
&RHS
) {
3606 EXPECT_TRUE(LHS
== RHS
);
3607 EXPECT_FALSE(LHS
!= RHS
);
3608 EXPECT_FALSE(LHS
< RHS
);
3609 EXPECT_FALSE(LHS
> RHS
);
3610 EXPECT_TRUE(LHS
<= RHS
);
3611 EXPECT_TRUE(LHS
>= RHS
);
3613 Relation GT
= [](const APFloat
&LHS
, const APFloat
&RHS
) {
3614 EXPECT_FALSE(LHS
== RHS
);
3615 EXPECT_TRUE(LHS
!= RHS
);
3616 EXPECT_FALSE(LHS
< RHS
);
3617 EXPECT_TRUE(LHS
> RHS
);
3618 EXPECT_FALSE(LHS
<= RHS
);
3619 EXPECT_TRUE(LHS
>= RHS
);
3621 Relation UN
= [](const APFloat
&LHS
, const APFloat
&RHS
) {
3622 EXPECT_FALSE(LHS
== RHS
);
3623 EXPECT_TRUE(LHS
!= RHS
);
3624 EXPECT_FALSE(LHS
< RHS
);
3625 EXPECT_FALSE(LHS
> RHS
);
3626 EXPECT_FALSE(LHS
<= RHS
);
3627 EXPECT_FALSE(LHS
>= RHS
);
3629 Relation Relations
[NumVals
][NumVals
] = {
3630 // -N -I -B -1 -0 +0 +1 +B +I +N
3631 /* MNan */ {UN
, UN
, UN
, UN
, UN
, UN
, UN
, UN
, UN
, UN
},
3632 /* MInf */ {UN
, EQ
, LT
, LT
, LT
, LT
, LT
, LT
, LT
, UN
},
3633 /* MBig */ {UN
, GT
, EQ
, LT
, LT
, LT
, LT
, LT
, LT
, UN
},
3634 /* MOne */ {UN
, GT
, GT
, EQ
, LT
, LT
, LT
, LT
, LT
, UN
},
3635 /* MZer */ {UN
, GT
, GT
, GT
, EQ
, EQ
, LT
, LT
, LT
, UN
},
3636 /* PZer */ {UN
, GT
, GT
, GT
, EQ
, EQ
, LT
, LT
, LT
, UN
},
3637 /* POne */ {UN
, GT
, GT
, GT
, GT
, GT
, EQ
, LT
, LT
, UN
},
3638 /* PBig */ {UN
, GT
, GT
, GT
, GT
, GT
, GT
, EQ
, LT
, UN
},
3639 /* PInf */ {UN
, GT
, GT
, GT
, GT
, GT
, GT
, GT
, EQ
, UN
},
3640 /* PNan */ {UN
, UN
, UN
, UN
, UN
, UN
, UN
, UN
, UN
, UN
},
3642 for (unsigned I
= 0; I
< NumVals
; ++I
)
3643 for (unsigned J
= 0; J
< NumVals
; ++J
)
3644 Relations
[I
][J
](Vals
[I
], Vals
[J
]);
3647 TEST(APFloatTest
, abs
) {
3648 APFloat PInf
= APFloat::getInf(APFloat::IEEEsingle(), false);
3649 APFloat MInf
= APFloat::getInf(APFloat::IEEEsingle(), true);
3650 APFloat PZero
= APFloat::getZero(APFloat::IEEEsingle(), false);
3651 APFloat MZero
= APFloat::getZero(APFloat::IEEEsingle(), true);
3652 APFloat PQNaN
= APFloat::getNaN(APFloat::IEEEsingle(), false);
3653 APFloat MQNaN
= APFloat::getNaN(APFloat::IEEEsingle(), true);
3654 APFloat PSNaN
= APFloat::getSNaN(APFloat::IEEEsingle(), false);
3655 APFloat MSNaN
= APFloat::getSNaN(APFloat::IEEEsingle(), true);
3656 APFloat PNormalValue
= APFloat(APFloat::IEEEsingle(), "0x1p+0");
3657 APFloat MNormalValue
= APFloat(APFloat::IEEEsingle(), "-0x1p+0");
3658 APFloat PLargestValue
= APFloat::getLargest(APFloat::IEEEsingle(), false);
3659 APFloat MLargestValue
= APFloat::getLargest(APFloat::IEEEsingle(), true);
3660 APFloat PSmallestValue
= APFloat::getSmallest(APFloat::IEEEsingle(), false);
3661 APFloat MSmallestValue
= APFloat::getSmallest(APFloat::IEEEsingle(), true);
3662 APFloat PSmallestNormalized
=
3663 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false);
3664 APFloat MSmallestNormalized
=
3665 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true);
3667 EXPECT_TRUE(PInf
.bitwiseIsEqual(abs(PInf
)));
3668 EXPECT_TRUE(PInf
.bitwiseIsEqual(abs(MInf
)));
3669 EXPECT_TRUE(PZero
.bitwiseIsEqual(abs(PZero
)));
3670 EXPECT_TRUE(PZero
.bitwiseIsEqual(abs(MZero
)));
3671 EXPECT_TRUE(PQNaN
.bitwiseIsEqual(abs(PQNaN
)));
3672 EXPECT_TRUE(PQNaN
.bitwiseIsEqual(abs(MQNaN
)));
3673 EXPECT_TRUE(PSNaN
.bitwiseIsEqual(abs(PSNaN
)));
3674 EXPECT_TRUE(PSNaN
.bitwiseIsEqual(abs(MSNaN
)));
3675 EXPECT_TRUE(PNormalValue
.bitwiseIsEqual(abs(PNormalValue
)));
3676 EXPECT_TRUE(PNormalValue
.bitwiseIsEqual(abs(MNormalValue
)));
3677 EXPECT_TRUE(PLargestValue
.bitwiseIsEqual(abs(PLargestValue
)));
3678 EXPECT_TRUE(PLargestValue
.bitwiseIsEqual(abs(MLargestValue
)));
3679 EXPECT_TRUE(PSmallestValue
.bitwiseIsEqual(abs(PSmallestValue
)));
3680 EXPECT_TRUE(PSmallestValue
.bitwiseIsEqual(abs(MSmallestValue
)));
3681 EXPECT_TRUE(PSmallestNormalized
.bitwiseIsEqual(abs(PSmallestNormalized
)));
3682 EXPECT_TRUE(PSmallestNormalized
.bitwiseIsEqual(abs(MSmallestNormalized
)));
3685 TEST(APFloatTest
, neg
) {
3686 APFloat One
= APFloat(APFloat::IEEEsingle(), "1.0");
3687 APFloat NegOne
= APFloat(APFloat::IEEEsingle(), "-1.0");
3688 APFloat Zero
= APFloat::getZero(APFloat::IEEEsingle(), false);
3689 APFloat NegZero
= APFloat::getZero(APFloat::IEEEsingle(), true);
3690 APFloat Inf
= APFloat::getInf(APFloat::IEEEsingle(), false);
3691 APFloat NegInf
= APFloat::getInf(APFloat::IEEEsingle(), true);
3692 APFloat QNaN
= APFloat::getNaN(APFloat::IEEEsingle(), false);
3693 APFloat NegQNaN
= APFloat::getNaN(APFloat::IEEEsingle(), true);
3695 EXPECT_TRUE(NegOne
.bitwiseIsEqual(neg(One
)));
3696 EXPECT_TRUE(One
.bitwiseIsEqual(neg(NegOne
)));
3697 EXPECT_TRUE(NegZero
.bitwiseIsEqual(neg(Zero
)));
3698 EXPECT_TRUE(Zero
.bitwiseIsEqual(neg(NegZero
)));
3699 EXPECT_TRUE(NegInf
.bitwiseIsEqual(neg(Inf
)));
3700 EXPECT_TRUE(Inf
.bitwiseIsEqual(neg(NegInf
)));
3701 EXPECT_TRUE(NegInf
.bitwiseIsEqual(neg(Inf
)));
3702 EXPECT_TRUE(Inf
.bitwiseIsEqual(neg(NegInf
)));
3703 EXPECT_TRUE(NegQNaN
.bitwiseIsEqual(neg(QNaN
)));
3704 EXPECT_TRUE(QNaN
.bitwiseIsEqual(neg(NegQNaN
)));
3706 EXPECT_TRUE(NegOne
.bitwiseIsEqual(-One
));
3707 EXPECT_TRUE(One
.bitwiseIsEqual(-NegOne
));
3708 EXPECT_TRUE(NegZero
.bitwiseIsEqual(-Zero
));
3709 EXPECT_TRUE(Zero
.bitwiseIsEqual(-NegZero
));
3710 EXPECT_TRUE(NegInf
.bitwiseIsEqual(-Inf
));
3711 EXPECT_TRUE(Inf
.bitwiseIsEqual(-NegInf
));
3712 EXPECT_TRUE(NegInf
.bitwiseIsEqual(-Inf
));
3713 EXPECT_TRUE(Inf
.bitwiseIsEqual(-NegInf
));
3714 EXPECT_TRUE(NegQNaN
.bitwiseIsEqual(-QNaN
));
3715 EXPECT_TRUE(QNaN
.bitwiseIsEqual(-NegQNaN
));
3718 TEST(APFloatTest
, ilogb
) {
3719 EXPECT_EQ(-1074, ilogb(APFloat::getSmallest(APFloat::IEEEdouble(), false)));
3720 EXPECT_EQ(-1074, ilogb(APFloat::getSmallest(APFloat::IEEEdouble(), true)));
3721 EXPECT_EQ(-1023, ilogb(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1024")));
3722 EXPECT_EQ(-1023, ilogb(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1023")));
3723 EXPECT_EQ(-1023, ilogb(APFloat(APFloat::IEEEdouble(), "-0x1.ffffffffffffep-1023")));
3724 EXPECT_EQ(-51, ilogb(APFloat(APFloat::IEEEdouble(), "0x1p-51")));
3725 EXPECT_EQ(-1023, ilogb(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp-1023")));
3726 EXPECT_EQ(-2, ilogb(APFloat(APFloat::IEEEdouble(), "0x0.ffffp-1")));
3727 EXPECT_EQ(-1023, ilogb(APFloat(APFloat::IEEEdouble(), "0x1.fffep-1023")));
3728 EXPECT_EQ(1023, ilogb(APFloat::getLargest(APFloat::IEEEdouble(), false)));
3729 EXPECT_EQ(1023, ilogb(APFloat::getLargest(APFloat::IEEEdouble(), true)));
3732 EXPECT_EQ(0, ilogb(APFloat(APFloat::IEEEsingle(), "0x1p+0")));
3733 EXPECT_EQ(0, ilogb(APFloat(APFloat::IEEEsingle(), "-0x1p+0")));
3734 EXPECT_EQ(42, ilogb(APFloat(APFloat::IEEEsingle(), "0x1p+42")));
3735 EXPECT_EQ(-42, ilogb(APFloat(APFloat::IEEEsingle(), "0x1p-42")));
3737 EXPECT_EQ(APFloat::IEK_Inf
,
3738 ilogb(APFloat::getInf(APFloat::IEEEsingle(), false)));
3739 EXPECT_EQ(APFloat::IEK_Inf
,
3740 ilogb(APFloat::getInf(APFloat::IEEEsingle(), true)));
3741 EXPECT_EQ(APFloat::IEK_Zero
,
3742 ilogb(APFloat::getZero(APFloat::IEEEsingle(), false)));
3743 EXPECT_EQ(APFloat::IEK_Zero
,
3744 ilogb(APFloat::getZero(APFloat::IEEEsingle(), true)));
3745 EXPECT_EQ(APFloat::IEK_NaN
,
3746 ilogb(APFloat::getNaN(APFloat::IEEEsingle(), false)));
3747 EXPECT_EQ(APFloat::IEK_NaN
,
3748 ilogb(APFloat::getSNaN(APFloat::IEEEsingle(), false)));
3750 EXPECT_EQ(127, ilogb(APFloat::getLargest(APFloat::IEEEsingle(), false)));
3751 EXPECT_EQ(127, ilogb(APFloat::getLargest(APFloat::IEEEsingle(), true)));
3753 EXPECT_EQ(-149, ilogb(APFloat::getSmallest(APFloat::IEEEsingle(), false)));
3754 EXPECT_EQ(-149, ilogb(APFloat::getSmallest(APFloat::IEEEsingle(), true)));
3756 ilogb(APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false)));
3758 ilogb(APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true)));
3761 TEST(APFloatTest
, scalbn
) {
3763 const APFloat::roundingMode RM
= APFloat::rmNearestTiesToEven
;
3765 APFloat(APFloat::IEEEsingle(), "0x1p+0")
3766 .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle(), "0x1p+0"), 0, RM
)));
3768 APFloat(APFloat::IEEEsingle(), "0x1p+42")
3769 .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle(), "0x1p+0"), 42, RM
)));
3771 APFloat(APFloat::IEEEsingle(), "0x1p-42")
3772 .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle(), "0x1p+0"), -42, RM
)));
3774 APFloat PInf
= APFloat::getInf(APFloat::IEEEsingle(), false);
3775 APFloat MInf
= APFloat::getInf(APFloat::IEEEsingle(), true);
3776 APFloat PZero
= APFloat::getZero(APFloat::IEEEsingle(), false);
3777 APFloat MZero
= APFloat::getZero(APFloat::IEEEsingle(), true);
3778 APFloat QPNaN
= APFloat::getNaN(APFloat::IEEEsingle(), false);
3779 APFloat QMNaN
= APFloat::getNaN(APFloat::IEEEsingle(), true);
3780 APFloat SNaN
= APFloat::getSNaN(APFloat::IEEEsingle(), false);
3782 EXPECT_TRUE(PInf
.bitwiseIsEqual(scalbn(PInf
, 0, RM
)));
3783 EXPECT_TRUE(MInf
.bitwiseIsEqual(scalbn(MInf
, 0, RM
)));
3784 EXPECT_TRUE(PZero
.bitwiseIsEqual(scalbn(PZero
, 0, RM
)));
3785 EXPECT_TRUE(MZero
.bitwiseIsEqual(scalbn(MZero
, 0, RM
)));
3786 EXPECT_TRUE(QPNaN
.bitwiseIsEqual(scalbn(QPNaN
, 0, RM
)));
3787 EXPECT_TRUE(QMNaN
.bitwiseIsEqual(scalbn(QMNaN
, 0, RM
)));
3788 EXPECT_FALSE(scalbn(SNaN
, 0, RM
).isSignaling());
3790 APFloat ScalbnSNaN
= scalbn(SNaN
, 1, RM
);
3791 EXPECT_TRUE(ScalbnSNaN
.isNaN() && !ScalbnSNaN
.isSignaling());
3793 // Make sure highest bit of payload is preserved.
3794 const APInt
Payload(64, (UINT64_C(1) << 50) |
3795 (UINT64_C(1) << 49) |
3796 (UINT64_C(1234) << 32) |
3799 APFloat SNaNWithPayload
= APFloat::getSNaN(APFloat::IEEEdouble(), false,
3801 APFloat QuietPayload
= scalbn(SNaNWithPayload
, 1, RM
);
3802 EXPECT_TRUE(QuietPayload
.isNaN() && !QuietPayload
.isSignaling());
3803 EXPECT_EQ(Payload
, QuietPayload
.bitcastToAPInt().getLoBits(51));
3805 EXPECT_TRUE(PInf
.bitwiseIsEqual(
3806 scalbn(APFloat(APFloat::IEEEsingle(), "0x1p+0"), 128, RM
)));
3807 EXPECT_TRUE(MInf
.bitwiseIsEqual(
3808 scalbn(APFloat(APFloat::IEEEsingle(), "-0x1p+0"), 128, RM
)));
3809 EXPECT_TRUE(PInf
.bitwiseIsEqual(
3810 scalbn(APFloat(APFloat::IEEEsingle(), "0x1p+127"), 1, RM
)));
3811 EXPECT_TRUE(PZero
.bitwiseIsEqual(
3812 scalbn(APFloat(APFloat::IEEEsingle(), "0x1p-127"), -127, RM
)));
3813 EXPECT_TRUE(MZero
.bitwiseIsEqual(
3814 scalbn(APFloat(APFloat::IEEEsingle(), "-0x1p-127"), -127, RM
)));
3815 EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "-0x1p-149").bitwiseIsEqual(
3816 scalbn(APFloat(APFloat::IEEEsingle(), "-0x1p-127"), -22, RM
)));
3817 EXPECT_TRUE(PZero
.bitwiseIsEqual(
3818 scalbn(APFloat(APFloat::IEEEsingle(), "0x1p-126"), -24, RM
)));
3821 APFloat SmallestF64
= APFloat::getSmallest(APFloat::IEEEdouble(), false);
3822 APFloat NegSmallestF64
= APFloat::getSmallest(APFloat::IEEEdouble(), true);
3824 APFloat LargestF64
= APFloat::getLargest(APFloat::IEEEdouble(), false);
3825 APFloat NegLargestF64
= APFloat::getLargest(APFloat::IEEEdouble(), true);
3827 APFloat SmallestNormalizedF64
3828 = APFloat::getSmallestNormalized(APFloat::IEEEdouble(), false);
3829 APFloat NegSmallestNormalizedF64
3830 = APFloat::getSmallestNormalized(APFloat::IEEEdouble(), true);
3832 APFloat
LargestDenormalF64(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1023");
3833 APFloat
NegLargestDenormalF64(APFloat::IEEEdouble(), "-0x1.ffffffffffffep-1023");
3836 EXPECT_TRUE(SmallestF64
.bitwiseIsEqual(
3837 scalbn(APFloat(APFloat::IEEEdouble(), "0x1p-1074"), 0, RM
)));
3838 EXPECT_TRUE(NegSmallestF64
.bitwiseIsEqual(
3839 scalbn(APFloat(APFloat::IEEEdouble(), "-0x1p-1074"), 0, RM
)));
3841 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p+1023")
3842 .bitwiseIsEqual(scalbn(SmallestF64
, 2097, RM
)));
3844 EXPECT_TRUE(scalbn(SmallestF64
, -2097, RM
).isPosZero());
3845 EXPECT_TRUE(scalbn(SmallestF64
, -2098, RM
).isPosZero());
3846 EXPECT_TRUE(scalbn(SmallestF64
, -2099, RM
).isPosZero());
3847 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p+1022")
3848 .bitwiseIsEqual(scalbn(SmallestF64
, 2096, RM
)));
3849 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p+1023")
3850 .bitwiseIsEqual(scalbn(SmallestF64
, 2097, RM
)));
3851 EXPECT_TRUE(scalbn(SmallestF64
, 2098, RM
).isInfinity());
3852 EXPECT_TRUE(scalbn(SmallestF64
, 2099, RM
).isInfinity());
3854 // Test for integer overflows when adding to exponent.
3855 EXPECT_TRUE(scalbn(SmallestF64
, -INT_MAX
, RM
).isPosZero());
3856 EXPECT_TRUE(scalbn(LargestF64
, INT_MAX
, RM
).isInfinity());
3858 EXPECT_TRUE(LargestDenormalF64
3859 .bitwiseIsEqual(scalbn(LargestDenormalF64
, 0, RM
)));
3860 EXPECT_TRUE(NegLargestDenormalF64
3861 .bitwiseIsEqual(scalbn(NegLargestDenormalF64
, 0, RM
)));
3863 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1022")
3864 .bitwiseIsEqual(scalbn(LargestDenormalF64
, 1, RM
)));
3865 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1.ffffffffffffep-1021")
3866 .bitwiseIsEqual(scalbn(NegLargestDenormalF64
, 2, RM
)));
3868 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep+1")
3869 .bitwiseIsEqual(scalbn(LargestDenormalF64
, 1024, RM
)));
3870 EXPECT_TRUE(scalbn(LargestDenormalF64
, -1023, RM
).isPosZero());
3871 EXPECT_TRUE(scalbn(LargestDenormalF64
, -1024, RM
).isPosZero());
3872 EXPECT_TRUE(scalbn(LargestDenormalF64
, -2048, RM
).isPosZero());
3873 EXPECT_TRUE(scalbn(LargestDenormalF64
, 2047, RM
).isInfinity());
3874 EXPECT_TRUE(scalbn(LargestDenormalF64
, 2098, RM
).isInfinity());
3875 EXPECT_TRUE(scalbn(LargestDenormalF64
, 2099, RM
).isInfinity());
3877 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-2")
3878 .bitwiseIsEqual(scalbn(LargestDenormalF64
, 1021, RM
)));
3879 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1")
3880 .bitwiseIsEqual(scalbn(LargestDenormalF64
, 1022, RM
)));
3881 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep+0")
3882 .bitwiseIsEqual(scalbn(LargestDenormalF64
, 1023, RM
)));
3883 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep+1023")
3884 .bitwiseIsEqual(scalbn(LargestDenormalF64
, 2046, RM
)));
3885 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p+974")
3886 .bitwiseIsEqual(scalbn(SmallestF64
, 2048, RM
)));
3888 APFloat
RandomDenormalF64(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp+51");
3889 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp-972")
3890 .bitwiseIsEqual(scalbn(RandomDenormalF64
, -1023, RM
)));
3891 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp-1")
3892 .bitwiseIsEqual(scalbn(RandomDenormalF64
, -52, RM
)));
3893 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp-2")
3894 .bitwiseIsEqual(scalbn(RandomDenormalF64
, -53, RM
)));
3895 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp+0")
3896 .bitwiseIsEqual(scalbn(RandomDenormalF64
, -51, RM
)));
3898 EXPECT_TRUE(scalbn(RandomDenormalF64
, -2097, RM
).isPosZero());
3899 EXPECT_TRUE(scalbn(RandomDenormalF64
, -2090, RM
).isPosZero());
3903 APFloat(APFloat::IEEEdouble(), "-0x1p-1073")
3904 .bitwiseIsEqual(scalbn(NegLargestF64
, -2097, RM
)));
3907 APFloat(APFloat::IEEEdouble(), "-0x1p-1024")
3908 .bitwiseIsEqual(scalbn(NegLargestF64
, -2048, RM
)));
3911 APFloat(APFloat::IEEEdouble(), "0x1p-1073")
3912 .bitwiseIsEqual(scalbn(LargestF64
, -2097, RM
)));
3915 APFloat(APFloat::IEEEdouble(), "0x1p-1074")
3916 .bitwiseIsEqual(scalbn(LargestF64
, -2098, RM
)));
3917 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1p-1074")
3918 .bitwiseIsEqual(scalbn(NegLargestF64
, -2098, RM
)));
3919 EXPECT_TRUE(scalbn(NegLargestF64
, -2099, RM
).isNegZero());
3920 EXPECT_TRUE(scalbn(LargestF64
, 1, RM
).isInfinity());
3924 APFloat(APFloat::IEEEdouble(), "0x1p+0")
3925 .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEdouble(), "0x1p+52"), -52, RM
)));
3928 APFloat(APFloat::IEEEdouble(), "0x1p-103")
3929 .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEdouble(), "0x1p-51"), -52, RM
)));
3932 TEST(APFloatTest
, frexp
) {
3933 const APFloat::roundingMode RM
= APFloat::rmNearestTiesToEven
;
3935 APFloat PZero
= APFloat::getZero(APFloat::IEEEdouble(), false);
3936 APFloat MZero
= APFloat::getZero(APFloat::IEEEdouble(), true);
3942 APFloat
LargestDenormal(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1023");
3943 APFloat
NegLargestDenormal(APFloat::IEEEdouble(), "-0x1.ffffffffffffep-1023");
3945 APFloat Smallest
= APFloat::getSmallest(APFloat::IEEEdouble(), false);
3946 APFloat NegSmallest
= APFloat::getSmallest(APFloat::IEEEdouble(), true);
3948 APFloat Largest
= APFloat::getLargest(APFloat::IEEEdouble(), false);
3949 APFloat NegLargest
= APFloat::getLargest(APFloat::IEEEdouble(), true);
3951 APFloat PInf
= APFloat::getInf(APFloat::IEEEdouble(), false);
3952 APFloat MInf
= APFloat::getInf(APFloat::IEEEdouble(), true);
3954 APFloat QPNaN
= APFloat::getNaN(APFloat::IEEEdouble(), false);
3955 APFloat QMNaN
= APFloat::getNaN(APFloat::IEEEdouble(), true);
3956 APFloat SNaN
= APFloat::getSNaN(APFloat::IEEEdouble(), false);
3958 // Make sure highest bit of payload is preserved.
3959 const APInt
Payload(64, (UINT64_C(1) << 50) |
3960 (UINT64_C(1) << 49) |
3961 (UINT64_C(1234) << 32) |
3964 APFloat SNaNWithPayload
= APFloat::getSNaN(APFloat::IEEEdouble(), false,
3967 APFloat SmallestNormalized
3968 = APFloat::getSmallestNormalized(APFloat::IEEEdouble(), false);
3969 APFloat NegSmallestNormalized
3970 = APFloat::getSmallestNormalized(APFloat::IEEEdouble(), true);
3973 APFloat
Frac(APFloat::IEEEdouble());
3976 Frac
= frexp(PZero
, Exp
, RM
);
3978 EXPECT_TRUE(Frac
.isPosZero());
3980 Frac
= frexp(MZero
, Exp
, RM
);
3982 EXPECT_TRUE(Frac
.isNegZero());
3985 Frac
= frexp(One
, Exp
, RM
);
3987 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p-1").bitwiseIsEqual(Frac
));
3989 Frac
= frexp(MOne
, Exp
, RM
);
3991 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1p-1").bitwiseIsEqual(Frac
));
3993 Frac
= frexp(LargestDenormal
, Exp
, RM
);
3994 EXPECT_EQ(-1022, Exp
);
3995 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1").bitwiseIsEqual(Frac
));
3997 Frac
= frexp(NegLargestDenormal
, Exp
, RM
);
3998 EXPECT_EQ(-1022, Exp
);
3999 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1.ffffffffffffep-1").bitwiseIsEqual(Frac
));
4002 Frac
= frexp(Smallest
, Exp
, RM
);
4003 EXPECT_EQ(-1073, Exp
);
4004 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p-1").bitwiseIsEqual(Frac
));
4006 Frac
= frexp(NegSmallest
, Exp
, RM
);
4007 EXPECT_EQ(-1073, Exp
);
4008 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1p-1").bitwiseIsEqual(Frac
));
4011 Frac
= frexp(Largest
, Exp
, RM
);
4012 EXPECT_EQ(1024, Exp
);
4013 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.fffffffffffffp-1").bitwiseIsEqual(Frac
));
4015 Frac
= frexp(NegLargest
, Exp
, RM
);
4016 EXPECT_EQ(1024, Exp
);
4017 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1.fffffffffffffp-1").bitwiseIsEqual(Frac
));
4020 Frac
= frexp(PInf
, Exp
, RM
);
4021 EXPECT_EQ(INT_MAX
, Exp
);
4022 EXPECT_TRUE(Frac
.isInfinity() && !Frac
.isNegative());
4024 Frac
= frexp(MInf
, Exp
, RM
);
4025 EXPECT_EQ(INT_MAX
, Exp
);
4026 EXPECT_TRUE(Frac
.isInfinity() && Frac
.isNegative());
4028 Frac
= frexp(QPNaN
, Exp
, RM
);
4029 EXPECT_EQ(INT_MIN
, Exp
);
4030 EXPECT_TRUE(Frac
.isNaN());
4032 Frac
= frexp(QMNaN
, Exp
, RM
);
4033 EXPECT_EQ(INT_MIN
, Exp
);
4034 EXPECT_TRUE(Frac
.isNaN());
4036 Frac
= frexp(SNaN
, Exp
, RM
);
4037 EXPECT_EQ(INT_MIN
, Exp
);
4038 EXPECT_TRUE(Frac
.isNaN() && !Frac
.isSignaling());
4040 Frac
= frexp(SNaNWithPayload
, Exp
, RM
);
4041 EXPECT_EQ(INT_MIN
, Exp
);
4042 EXPECT_TRUE(Frac
.isNaN() && !Frac
.isSignaling());
4043 EXPECT_EQ(Payload
, Frac
.bitcastToAPInt().getLoBits(51));
4045 Frac
= frexp(APFloat(APFloat::IEEEdouble(), "0x0.ffffp-1"), Exp
, RM
);
4047 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.fffep-1").bitwiseIsEqual(Frac
));
4049 Frac
= frexp(APFloat(APFloat::IEEEdouble(), "0x1p-51"), Exp
, RM
);
4050 EXPECT_EQ(-50, Exp
);
4051 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p-1").bitwiseIsEqual(Frac
));
4053 Frac
= frexp(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp+51"), Exp
, RM
);
4055 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp-1").bitwiseIsEqual(Frac
));
4058 TEST(APFloatTest
, mod
) {
4060 APFloat
f1(APFloat::IEEEdouble(), "1.5");
4061 APFloat
f2(APFloat::IEEEdouble(), "1.0");
4062 APFloat
expected(APFloat::IEEEdouble(), "0.5");
4063 EXPECT_EQ(f1
.mod(f2
), APFloat::opOK
);
4064 EXPECT_TRUE(f1
.bitwiseIsEqual(expected
));
4067 APFloat
f1(APFloat::IEEEdouble(), "0.5");
4068 APFloat
f2(APFloat::IEEEdouble(), "1.0");
4069 APFloat
expected(APFloat::IEEEdouble(), "0.5");
4070 EXPECT_EQ(f1
.mod(f2
), APFloat::opOK
);
4071 EXPECT_TRUE(f1
.bitwiseIsEqual(expected
));
4074 APFloat
f1(APFloat::IEEEdouble(), "0x1.3333333333333p-2"); // 0.3
4075 APFloat
f2(APFloat::IEEEdouble(), "0x1.47ae147ae147bp-7"); // 0.01
4076 APFloat
expected(APFloat::IEEEdouble(),
4077 "0x1.47ae147ae1471p-7"); // 0.009999999999999983
4078 EXPECT_EQ(f1
.mod(f2
), APFloat::opOK
);
4079 EXPECT_TRUE(f1
.bitwiseIsEqual(expected
));
4082 APFloat
f1(APFloat::IEEEdouble(), "0x1p64"); // 1.8446744073709552e19
4083 APFloat
f2(APFloat::IEEEdouble(), "1.5");
4084 APFloat
expected(APFloat::IEEEdouble(), "1.0");
4085 EXPECT_EQ(f1
.mod(f2
), APFloat::opOK
);
4086 EXPECT_TRUE(f1
.bitwiseIsEqual(expected
));
4089 APFloat
f1(APFloat::IEEEdouble(), "0x1p1000");
4090 APFloat
f2(APFloat::IEEEdouble(), "0x1p-1000");
4091 APFloat
expected(APFloat::IEEEdouble(), "0.0");
4092 EXPECT_EQ(f1
.mod(f2
), APFloat::opOK
);
4093 EXPECT_TRUE(f1
.bitwiseIsEqual(expected
));
4096 APFloat
f1(APFloat::IEEEdouble(), "0.0");
4097 APFloat
f2(APFloat::IEEEdouble(), "1.0");
4098 APFloat
expected(APFloat::IEEEdouble(), "0.0");
4099 EXPECT_EQ(f1
.mod(f2
), APFloat::opOK
);
4100 EXPECT_TRUE(f1
.bitwiseIsEqual(expected
));
4103 APFloat
f1(APFloat::IEEEdouble(), "1.0");
4104 APFloat
f2(APFloat::IEEEdouble(), "0.0");
4105 EXPECT_EQ(f1
.mod(f2
), APFloat::opInvalidOp
);
4106 EXPECT_TRUE(f1
.isNaN());
4109 APFloat
f1(APFloat::IEEEdouble(), "0.0");
4110 APFloat
f2(APFloat::IEEEdouble(), "0.0");
4111 EXPECT_EQ(f1
.mod(f2
), APFloat::opInvalidOp
);
4112 EXPECT_TRUE(f1
.isNaN());
4115 APFloat f1
= APFloat::getInf(APFloat::IEEEdouble(), false);
4116 APFloat
f2(APFloat::IEEEdouble(), "1.0");
4117 EXPECT_EQ(f1
.mod(f2
), APFloat::opInvalidOp
);
4118 EXPECT_TRUE(f1
.isNaN());
4121 APFloat
f1(APFloat::IEEEdouble(), "-4.0");
4122 APFloat
f2(APFloat::IEEEdouble(), "-2.0");
4123 APFloat
expected(APFloat::IEEEdouble(), "-0.0");
4124 EXPECT_EQ(f1
.mod(f2
), APFloat::opOK
);
4125 EXPECT_TRUE(f1
.bitwiseIsEqual(expected
));
4128 APFloat
f1(APFloat::IEEEdouble(), "-4.0");
4129 APFloat
f2(APFloat::IEEEdouble(), "2.0");
4130 APFloat
expected(APFloat::IEEEdouble(), "-0.0");
4131 EXPECT_EQ(f1
.mod(f2
), APFloat::opOK
);
4132 EXPECT_TRUE(f1
.bitwiseIsEqual(expected
));
4135 // Test E4M3FN mod where the LHS exponent is maxExponent (8) and the RHS is
4136 // the max value whose exponent is minExponent (-6). This requires special
4137 // logic in the mod implementation to prevent overflow to NaN.
4138 APFloat
f1(APFloat::Float8E4M3FN(), "0x1p8"); // 256
4139 APFloat
f2(APFloat::Float8E4M3FN(), "0x1.ep-6"); // 0.029296875
4140 APFloat
expected(APFloat::Float8E4M3FN(), "0x1p-8"); // 0.00390625
4141 EXPECT_EQ(f1
.mod(f2
), APFloat::opOK
);
4142 EXPECT_TRUE(f1
.bitwiseIsEqual(expected
));
4146 TEST(APFloatTest
, remainder
) {
4147 // Test Special Cases against each other and normal values.
4149 APFloat PInf
= APFloat::getInf(APFloat::IEEEsingle(), false);
4150 APFloat MInf
= APFloat::getInf(APFloat::IEEEsingle(), true);
4151 APFloat PZero
= APFloat::getZero(APFloat::IEEEsingle(), false);
4152 APFloat MZero
= APFloat::getZero(APFloat::IEEEsingle(), true);
4153 APFloat QNaN
= APFloat::getNaN(APFloat::IEEEsingle(), false);
4154 APFloat SNaN
= APFloat(APFloat::IEEEsingle(), "snan123");
4155 APFloat PNormalValue
= APFloat(APFloat::IEEEsingle(), "0x1p+0");
4156 APFloat MNormalValue
= APFloat(APFloat::IEEEsingle(), "-0x1p+0");
4157 APFloat PLargestValue
= APFloat::getLargest(APFloat::IEEEsingle(), false);
4158 APFloat MLargestValue
= APFloat::getLargest(APFloat::IEEEsingle(), true);
4159 APFloat PSmallestValue
= APFloat::getSmallest(APFloat::IEEEsingle(), false);
4160 APFloat MSmallestValue
= APFloat::getSmallest(APFloat::IEEEsingle(), true);
4161 APFloat PSmallestNormalized
=
4162 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false);
4163 APFloat MSmallestNormalized
=
4164 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true);
4166 APFloat
PVal1(APFloat::IEEEsingle(), "0x1.fffffep+126");
4167 APFloat
MVal1(APFloat::IEEEsingle(), "-0x1.fffffep+126");
4168 APFloat
PVal2(APFloat::IEEEsingle(), "0x1.fffffep-126");
4169 APFloat
MVal2(APFloat::IEEEsingle(), "-0x1.fffffep-126");
4170 APFloat
PVal3(APFloat::IEEEsingle(), "0x1p-125");
4171 APFloat
MVal3(APFloat::IEEEsingle(), "-0x1p-125");
4172 APFloat
PVal4(APFloat::IEEEsingle(), "0x1p+127");
4173 APFloat
MVal4(APFloat::IEEEsingle(), "-0x1p+127");
4174 APFloat
PVal5(APFloat::IEEEsingle(), "1.5");
4175 APFloat
MVal5(APFloat::IEEEsingle(), "-1.5");
4176 APFloat
PVal6(APFloat::IEEEsingle(), "1");
4177 APFloat
MVal6(APFloat::IEEEsingle(), "-1");
4185 } SpecialCaseTests
[] = {
4186 { PInf
, PInf
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4187 { PInf
, MInf
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4188 { PInf
, PZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4189 { PInf
, MZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4190 { PInf
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4191 { PInf
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4192 { PInf
, PNormalValue
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4193 { PInf
, MNormalValue
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4194 { PInf
, PLargestValue
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4195 { PInf
, MLargestValue
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4196 { PInf
, PSmallestValue
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4197 { PInf
, MSmallestValue
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4198 { PInf
, PSmallestNormalized
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4199 { PInf
, MSmallestNormalized
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4200 { MInf
, PInf
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4201 { MInf
, MInf
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4202 { MInf
, PZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4203 { MInf
, MZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4204 { MInf
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4205 { MInf
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4206 { MInf
, PNormalValue
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4207 { MInf
, MNormalValue
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4208 { MInf
, PLargestValue
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4209 { MInf
, MLargestValue
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4210 { MInf
, PSmallestValue
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4211 { MInf
, MSmallestValue
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4212 { MInf
, PSmallestNormalized
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4213 { MInf
, MSmallestNormalized
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4214 { PZero
, PInf
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4215 { PZero
, MInf
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4216 { PZero
, PZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4217 { PZero
, MZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4218 { PZero
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4219 { PZero
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4220 { PZero
, PNormalValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4221 { PZero
, MNormalValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4222 { PZero
, PLargestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4223 { PZero
, MLargestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4224 { PZero
, PSmallestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4225 { PZero
, MSmallestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4226 { PZero
, PSmallestNormalized
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4227 { PZero
, MSmallestNormalized
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4228 { MZero
, PInf
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4229 { MZero
, MInf
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4230 { MZero
, PZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4231 { MZero
, MZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4232 { MZero
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4233 { MZero
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4234 { MZero
, PNormalValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4235 { MZero
, MNormalValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4236 { MZero
, PLargestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4237 { MZero
, MLargestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4238 { MZero
, PSmallestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4239 { MZero
, MSmallestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4240 { MZero
, PSmallestNormalized
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4241 { MZero
, MSmallestNormalized
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4242 { QNaN
, PInf
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4243 { QNaN
, MInf
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4244 { QNaN
, PZero
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4245 { QNaN
, MZero
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4246 { QNaN
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4247 { QNaN
, SNaN
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4248 { QNaN
, PNormalValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4249 { QNaN
, MNormalValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4250 { QNaN
, PLargestValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4251 { QNaN
, MLargestValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4252 { QNaN
, PSmallestValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4253 { QNaN
, MSmallestValue
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4254 { QNaN
, PSmallestNormalized
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4255 { QNaN
, MSmallestNormalized
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4256 { SNaN
, PInf
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4257 { SNaN
, MInf
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4258 { SNaN
, PZero
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4259 { SNaN
, MZero
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4260 { SNaN
, QNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4261 { SNaN
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4262 { SNaN
, PNormalValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4263 { SNaN
, MNormalValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4264 { SNaN
, PLargestValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4265 { SNaN
, MLargestValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4266 { SNaN
, PSmallestValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4267 { SNaN
, MSmallestValue
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4268 { SNaN
, PSmallestNormalized
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4269 { SNaN
, MSmallestNormalized
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4270 { PNormalValue
, PInf
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
4271 { PNormalValue
, MInf
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
4272 { PNormalValue
, PZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4273 { PNormalValue
, MZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4274 { PNormalValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4275 { PNormalValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4276 { PNormalValue
, PNormalValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4277 { PNormalValue
, MNormalValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4278 { PNormalValue
, PLargestValue
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
4279 { PNormalValue
, MLargestValue
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
4280 { PNormalValue
, PSmallestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4281 { PNormalValue
, MSmallestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4282 { PNormalValue
, PSmallestNormalized
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4283 { PNormalValue
, MSmallestNormalized
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4284 { MNormalValue
, PInf
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
4285 { MNormalValue
, MInf
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
4286 { MNormalValue
, PZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4287 { MNormalValue
, MZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4288 { MNormalValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4289 { MNormalValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4290 { MNormalValue
, PNormalValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4291 { MNormalValue
, MNormalValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4292 { MNormalValue
, PLargestValue
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
4293 { MNormalValue
, MLargestValue
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
4294 { MNormalValue
, PSmallestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4295 { MNormalValue
, MSmallestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4296 { MNormalValue
, PSmallestNormalized
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4297 { MNormalValue
, MSmallestNormalized
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4298 { PLargestValue
, PInf
, "0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
4299 { PLargestValue
, MInf
, "0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
4300 { PLargestValue
, PZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4301 { PLargestValue
, MZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4302 { PLargestValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4303 { PLargestValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4304 { PLargestValue
, PNormalValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4305 { PLargestValue
, MNormalValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4306 { PLargestValue
, PLargestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4307 { PLargestValue
, MLargestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4308 { PLargestValue
, PSmallestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4309 { PLargestValue
, MSmallestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4310 { PLargestValue
, PSmallestNormalized
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4311 { PLargestValue
, MSmallestNormalized
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4312 { MLargestValue
, PInf
, "-0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
4313 { MLargestValue
, MInf
, "-0x1.fffffep+127", APFloat::opOK
, APFloat::fcNormal
},
4314 { MLargestValue
, PZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4315 { MLargestValue
, MZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4316 { MLargestValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4317 { MLargestValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4318 { MLargestValue
, PNormalValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4319 { MLargestValue
, MNormalValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4320 { MLargestValue
, PLargestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4321 { MLargestValue
, MLargestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4322 { MLargestValue
, PSmallestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4323 { MLargestValue
, MSmallestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4324 { MLargestValue
, PSmallestNormalized
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4325 { MLargestValue
, MSmallestNormalized
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4326 { PSmallestValue
, PInf
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
4327 { PSmallestValue
, MInf
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
4328 { PSmallestValue
, PZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4329 { PSmallestValue
, MZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4330 { PSmallestValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4331 { PSmallestValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4332 { PSmallestValue
, PNormalValue
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
4333 { PSmallestValue
, MNormalValue
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
4334 { PSmallestValue
, PLargestValue
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
4335 { PSmallestValue
, MLargestValue
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
4336 { PSmallestValue
, PSmallestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4337 { PSmallestValue
, MSmallestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4338 { PSmallestValue
, PSmallestNormalized
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
4339 { PSmallestValue
, MSmallestNormalized
, "0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
4340 { MSmallestValue
, PInf
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
4341 { MSmallestValue
, MInf
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
4342 { MSmallestValue
, PZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4343 { MSmallestValue
, MZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4344 { MSmallestValue
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4345 { MSmallestValue
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4346 { MSmallestValue
, PNormalValue
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
4347 { MSmallestValue
, MNormalValue
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
4348 { MSmallestValue
, PLargestValue
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
4349 { MSmallestValue
, MLargestValue
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
4350 { MSmallestValue
, PSmallestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4351 { MSmallestValue
, MSmallestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4352 { MSmallestValue
, PSmallestNormalized
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
4353 { MSmallestValue
, MSmallestNormalized
, "-0x1p-149", APFloat::opOK
, APFloat::fcNormal
},
4354 { PSmallestNormalized
, PInf
, "0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
4355 { PSmallestNormalized
, MInf
, "0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
4356 { PSmallestNormalized
, PZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4357 { PSmallestNormalized
, MZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4358 { PSmallestNormalized
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4359 { PSmallestNormalized
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4360 { PSmallestNormalized
, PNormalValue
, "0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
4361 { PSmallestNormalized
, MNormalValue
, "0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
4362 { PSmallestNormalized
, PLargestValue
, "0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
4363 { PSmallestNormalized
, MLargestValue
, "0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
4364 { PSmallestNormalized
, PSmallestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4365 { PSmallestNormalized
, MSmallestValue
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4366 { PSmallestNormalized
, PSmallestNormalized
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4367 { PSmallestNormalized
, MSmallestNormalized
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4368 { MSmallestNormalized
, PInf
, "-0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
4369 { MSmallestNormalized
, MInf
, "-0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
4370 { MSmallestNormalized
, PZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4371 { MSmallestNormalized
, MZero
, "nan", APFloat::opInvalidOp
, APFloat::fcNaN
},
4372 { MSmallestNormalized
, QNaN
, "nan", APFloat::opOK
, APFloat::fcNaN
},
4373 { MSmallestNormalized
, SNaN
, "nan123", APFloat::opInvalidOp
, APFloat::fcNaN
},
4374 { MSmallestNormalized
, PNormalValue
, "-0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
4375 { MSmallestNormalized
, MNormalValue
, "-0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
4376 { MSmallestNormalized
, PLargestValue
, "-0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
4377 { MSmallestNormalized
, MLargestValue
, "-0x1p-126", APFloat::opOK
, APFloat::fcNormal
},
4378 { MSmallestNormalized
, PSmallestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4379 { MSmallestNormalized
, MSmallestValue
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4380 { MSmallestNormalized
, PSmallestNormalized
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4381 { MSmallestNormalized
, MSmallestNormalized
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4383 { PVal1
, PVal1
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4384 { PVal1
, MVal1
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4385 { PVal1
, PVal2
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4386 { PVal1
, MVal2
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4387 { PVal1
, PVal3
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4388 { PVal1
, MVal3
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4389 { PVal1
, PVal4
, "-0x1p+103", APFloat::opOK
, APFloat::fcNormal
},
4390 { PVal1
, MVal4
, "-0x1p+103", APFloat::opOK
, APFloat::fcNormal
},
4391 { PVal1
, PVal5
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4392 { PVal1
, MVal5
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4393 { PVal1
, PVal6
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4394 { PVal1
, MVal6
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4395 { MVal1
, PVal1
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4396 { MVal1
, MVal1
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4397 { MVal1
, PVal2
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4398 { MVal1
, MVal2
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4399 { MVal1
, PVal3
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4400 { MVal1
, MVal3
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4401 { MVal1
, PVal4
, "0x1p+103", APFloat::opOK
, APFloat::fcNormal
},
4402 { MVal1
, MVal4
, "0x1p+103", APFloat::opOK
, APFloat::fcNormal
},
4403 { MVal1
, PVal5
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4404 { MVal1
, MVal5
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4405 { MVal1
, PVal6
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4406 { MVal1
, MVal6
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4407 { PVal2
, PVal1
, "0x1.fffffep-126", APFloat::opOK
, APFloat::fcNormal
},
4408 { PVal2
, MVal1
, "0x1.fffffep-126", APFloat::opOK
, APFloat::fcNormal
},
4409 { PVal2
, PVal2
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4410 { PVal2
, MVal2
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4411 { PVal2
, PVal3
, "-0x0.000002p-126", APFloat::opOK
, APFloat::fcNormal
},
4412 { PVal2
, MVal3
, "-0x0.000002p-126", APFloat::opOK
, APFloat::fcNormal
},
4413 { PVal2
, PVal4
, "0x1.fffffep-126", APFloat::opOK
, APFloat::fcNormal
},
4414 { PVal2
, MVal4
, "0x1.fffffep-126", APFloat::opOK
, APFloat::fcNormal
},
4415 { PVal2
, PVal5
, "0x1.fffffep-126", APFloat::opOK
, APFloat::fcNormal
},
4416 { PVal2
, MVal5
, "0x1.fffffep-126", APFloat::opOK
, APFloat::fcNormal
},
4417 { PVal2
, PVal6
, "0x1.fffffep-126", APFloat::opOK
, APFloat::fcNormal
},
4418 { PVal2
, MVal6
, "0x1.fffffep-126", APFloat::opOK
, APFloat::fcNormal
},
4419 { MVal2
, PVal1
, "-0x1.fffffep-126", APFloat::opOK
, APFloat::fcNormal
},
4420 { MVal2
, MVal1
, "-0x1.fffffep-126", APFloat::opOK
, APFloat::fcNormal
},
4421 { MVal2
, PVal2
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4422 { MVal2
, MVal2
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4423 { MVal2
, PVal3
, "0x0.000002p-126", APFloat::opOK
, APFloat::fcNormal
},
4424 { MVal2
, MVal3
, "0x0.000002p-126", APFloat::opOK
, APFloat::fcNormal
},
4425 { MVal2
, PVal4
, "-0x1.fffffep-126", APFloat::opOK
, APFloat::fcNormal
},
4426 { MVal2
, MVal4
, "-0x1.fffffep-126", APFloat::opOK
, APFloat::fcNormal
},
4427 { MVal2
, PVal5
, "-0x1.fffffep-126", APFloat::opOK
, APFloat::fcNormal
},
4428 { MVal2
, MVal5
, "-0x1.fffffep-126", APFloat::opOK
, APFloat::fcNormal
},
4429 { MVal2
, PVal6
, "-0x1.fffffep-126", APFloat::opOK
, APFloat::fcNormal
},
4430 { MVal2
, MVal6
, "-0x1.fffffep-126", APFloat::opOK
, APFloat::fcNormal
},
4431 { PVal3
, PVal1
, "0x1p-125", APFloat::opOK
, APFloat::fcNormal
},
4432 { PVal3
, MVal1
, "0x1p-125", APFloat::opOK
, APFloat::fcNormal
},
4433 { PVal3
, PVal2
, "0x0.000002p-126", APFloat::opOK
, APFloat::fcNormal
},
4434 { PVal3
, MVal2
, "0x0.000002p-126", APFloat::opOK
, APFloat::fcNormal
},
4435 { PVal3
, PVal3
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4436 { PVal3
, MVal3
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4437 { PVal3
, PVal4
, "0x1p-125", APFloat::opOK
, APFloat::fcNormal
},
4438 { PVal3
, MVal4
, "0x1p-125", APFloat::opOK
, APFloat::fcNormal
},
4439 { PVal3
, PVal5
, "0x1p-125", APFloat::opOK
, APFloat::fcNormal
},
4440 { PVal3
, MVal5
, "0x1p-125", APFloat::opOK
, APFloat::fcNormal
},
4441 { PVal3
, PVal6
, "0x1p-125", APFloat::opOK
, APFloat::fcNormal
},
4442 { PVal3
, MVal6
, "0x1p-125", APFloat::opOK
, APFloat::fcNormal
},
4443 { MVal3
, PVal1
, "-0x1p-125", APFloat::opOK
, APFloat::fcNormal
},
4444 { MVal3
, MVal1
, "-0x1p-125", APFloat::opOK
, APFloat::fcNormal
},
4445 { MVal3
, PVal2
, "-0x0.000002p-126", APFloat::opOK
, APFloat::fcNormal
},
4446 { MVal3
, MVal2
, "-0x0.000002p-126", APFloat::opOK
, APFloat::fcNormal
},
4447 { MVal3
, PVal3
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4448 { MVal3
, MVal3
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4449 { MVal3
, PVal4
, "-0x1p-125", APFloat::opOK
, APFloat::fcNormal
},
4450 { MVal3
, MVal4
, "-0x1p-125", APFloat::opOK
, APFloat::fcNormal
},
4451 { MVal3
, PVal5
, "-0x1p-125", APFloat::opOK
, APFloat::fcNormal
},
4452 { MVal3
, MVal5
, "-0x1p-125", APFloat::opOK
, APFloat::fcNormal
},
4453 { MVal3
, PVal6
, "-0x1p-125", APFloat::opOK
, APFloat::fcNormal
},
4454 { MVal3
, MVal6
, "-0x1p-125", APFloat::opOK
, APFloat::fcNormal
},
4455 { PVal4
, PVal1
, "0x1p+103", APFloat::opOK
, APFloat::fcNormal
},
4456 { PVal4
, MVal1
, "0x1p+103", APFloat::opOK
, APFloat::fcNormal
},
4457 { PVal4
, PVal2
, "0x0.002p-126", APFloat::opOK
, APFloat::fcNormal
},
4458 { PVal4
, MVal2
, "0x0.002p-126", APFloat::opOK
, APFloat::fcNormal
},
4459 { PVal4
, PVal3
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4460 { PVal4
, MVal3
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4461 { PVal4
, PVal4
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4462 { PVal4
, MVal4
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4463 { PVal4
, PVal5
, "0.5", APFloat::opOK
, APFloat::fcNormal
},
4464 { PVal4
, MVal5
, "0.5", APFloat::opOK
, APFloat::fcNormal
},
4465 { PVal4
, PVal6
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4466 { PVal4
, MVal6
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4467 { MVal4
, PVal1
, "-0x1p+103", APFloat::opOK
, APFloat::fcNormal
},
4468 { MVal4
, MVal1
, "-0x1p+103", APFloat::opOK
, APFloat::fcNormal
},
4469 { MVal4
, PVal2
, "-0x0.002p-126", APFloat::opOK
, APFloat::fcNormal
},
4470 { MVal4
, MVal2
, "-0x0.002p-126", APFloat::opOK
, APFloat::fcNormal
},
4471 { MVal4
, PVal3
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4472 { MVal4
, MVal3
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4473 { MVal4
, PVal4
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4474 { MVal4
, MVal4
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4475 { MVal4
, PVal5
, "-0.5", APFloat::opOK
, APFloat::fcNormal
},
4476 { MVal4
, MVal5
, "-0.5", APFloat::opOK
, APFloat::fcNormal
},
4477 { MVal4
, PVal6
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4478 { MVal4
, MVal6
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4479 { PVal5
, PVal1
, "1.5", APFloat::opOK
, APFloat::fcNormal
},
4480 { PVal5
, MVal1
, "1.5", APFloat::opOK
, APFloat::fcNormal
},
4481 { PVal5
, PVal2
, "0x0.00006p-126", APFloat::opOK
, APFloat::fcNormal
},
4482 { PVal5
, MVal2
, "0x0.00006p-126", APFloat::opOK
, APFloat::fcNormal
},
4483 { PVal5
, PVal3
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4484 { PVal5
, MVal3
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4485 { PVal5
, PVal4
, "1.5", APFloat::opOK
, APFloat::fcNormal
},
4486 { PVal5
, MVal4
, "1.5", APFloat::opOK
, APFloat::fcNormal
},
4487 { PVal5
, PVal5
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4488 { PVal5
, MVal5
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4489 { PVal5
, PVal6
, "-0.5", APFloat::opOK
, APFloat::fcNormal
},
4490 { PVal5
, MVal6
, "-0.5", APFloat::opOK
, APFloat::fcNormal
},
4491 { MVal5
, PVal1
, "-1.5", APFloat::opOK
, APFloat::fcNormal
},
4492 { MVal5
, MVal1
, "-1.5", APFloat::opOK
, APFloat::fcNormal
},
4493 { MVal5
, PVal2
, "-0x0.00006p-126", APFloat::opOK
, APFloat::fcNormal
},
4494 { MVal5
, MVal2
, "-0x0.00006p-126", APFloat::opOK
, APFloat::fcNormal
},
4495 { MVal5
, PVal3
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4496 { MVal5
, MVal3
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4497 { MVal5
, PVal4
, "-1.5", APFloat::opOK
, APFloat::fcNormal
},
4498 { MVal5
, MVal4
, "-1.5", APFloat::opOK
, APFloat::fcNormal
},
4499 { MVal5
, PVal5
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4500 { MVal5
, MVal5
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4501 { MVal5
, PVal6
, "0.5", APFloat::opOK
, APFloat::fcNormal
},
4502 { MVal5
, MVal6
, "0.5", APFloat::opOK
, APFloat::fcNormal
},
4503 { PVal6
, PVal1
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
4504 { PVal6
, MVal1
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
4505 { PVal6
, PVal2
, "0x0.00004p-126", APFloat::opOK
, APFloat::fcNormal
},
4506 { PVal6
, MVal2
, "0x0.00004p-126", APFloat::opOK
, APFloat::fcNormal
},
4507 { PVal6
, PVal3
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4508 { PVal6
, MVal3
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4509 { PVal6
, PVal4
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
4510 { PVal6
, MVal4
, "0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
4511 { PVal6
, PVal5
, "-0.5", APFloat::opOK
, APFloat::fcNormal
},
4512 { PVal6
, MVal5
, "-0.5", APFloat::opOK
, APFloat::fcNormal
},
4513 { PVal6
, PVal6
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4514 { PVal6
, MVal6
, "0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4515 { MVal6
, PVal1
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
4516 { MVal6
, MVal1
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
4517 { MVal6
, PVal2
, "-0x0.00004p-126", APFloat::opOK
, APFloat::fcNormal
},
4518 { MVal6
, MVal2
, "-0x0.00004p-126", APFloat::opOK
, APFloat::fcNormal
},
4519 { MVal6
, PVal3
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4520 { MVal6
, MVal3
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4521 { MVal6
, PVal4
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
4522 { MVal6
, MVal4
, "-0x1p+0", APFloat::opOK
, APFloat::fcNormal
},
4523 { MVal6
, PVal5
, "0.5", APFloat::opOK
, APFloat::fcNormal
},
4524 { MVal6
, MVal5
, "0.5", APFloat::opOK
, APFloat::fcNormal
},
4525 { MVal6
, PVal6
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4526 { MVal6
, MVal6
, "-0x0p+0", APFloat::opOK
, APFloat::fcZero
},
4529 for (size_t i
= 0; i
< std::size(SpecialCaseTests
); ++i
) {
4530 APFloat
x(SpecialCaseTests
[i
].x
);
4531 APFloat
y(SpecialCaseTests
[i
].y
);
4532 APFloat::opStatus status
= x
.remainder(y
);
4534 APFloat
result(x
.getSemantics(), SpecialCaseTests
[i
].result
);
4536 EXPECT_TRUE(result
.bitwiseIsEqual(x
));
4537 EXPECT_EQ(SpecialCaseTests
[i
].status
, (int)status
);
4538 EXPECT_EQ(SpecialCaseTests
[i
].category
, (int)x
.getCategory());
4542 APFloat
f1(APFloat::IEEEdouble(), "0x1.3333333333333p-2"); // 0.3
4543 APFloat
f2(APFloat::IEEEdouble(), "0x1.47ae147ae147bp-7"); // 0.01
4544 APFloat
expected(APFloat::IEEEdouble(), "-0x1.4p-56");
4545 EXPECT_EQ(APFloat::opOK
, f1
.remainder(f2
));
4546 EXPECT_TRUE(f1
.bitwiseIsEqual(expected
));
4549 APFloat
f1(APFloat::IEEEdouble(), "0x1p64"); // 1.8446744073709552e19
4550 APFloat
f2(APFloat::IEEEdouble(), "1.5");
4551 APFloat
expected(APFloat::IEEEdouble(), "-0.5");
4552 EXPECT_EQ(APFloat::opOK
, f1
.remainder(f2
));
4553 EXPECT_TRUE(f1
.bitwiseIsEqual(expected
));
4556 APFloat
f1(APFloat::IEEEdouble(), "0x1p1000");
4557 APFloat
f2(APFloat::IEEEdouble(), "0x1p-1000");
4558 APFloat
expected(APFloat::IEEEdouble(), "0.0");
4559 EXPECT_EQ(APFloat::opOK
, f1
.remainder(f2
));
4560 EXPECT_TRUE(f1
.bitwiseIsEqual(expected
));
4563 APFloat f1
= APFloat::getInf(APFloat::IEEEdouble(), false);
4564 APFloat
f2(APFloat::IEEEdouble(), "1.0");
4565 EXPECT_EQ(f1
.remainder(f2
), APFloat::opInvalidOp
);
4566 EXPECT_TRUE(f1
.isNaN());
4569 APFloat
f1(APFloat::IEEEdouble(), "-4.0");
4570 APFloat
f2(APFloat::IEEEdouble(), "-2.0");
4571 APFloat
expected(APFloat::IEEEdouble(), "-0.0");
4572 EXPECT_EQ(APFloat::opOK
, f1
.remainder(f2
));
4573 EXPECT_TRUE(f1
.bitwiseIsEqual(expected
));
4576 APFloat
f1(APFloat::IEEEdouble(), "-4.0");
4577 APFloat
f2(APFloat::IEEEdouble(), "2.0");
4578 APFloat
expected(APFloat::IEEEdouble(), "-0.0");
4579 EXPECT_EQ(APFloat::opOK
, f1
.remainder(f2
));
4580 EXPECT_TRUE(f1
.bitwiseIsEqual(expected
));
4584 TEST(APFloatTest
, PPCDoubleDoubleAddSpecial
) {
4585 using DataType
= std::tuple
<uint64_t, uint64_t, uint64_t, uint64_t,
4586 APFloat::fltCategory
, APFloat::roundingMode
>;
4588 // (1 + 0) + (-1 + 0) = fcZero
4589 std::make_tuple(0x3ff0000000000000ull
, 0, 0xbff0000000000000ull
, 0,
4590 APFloat::fcZero
, APFloat::rmNearestTiesToEven
),
4591 // LDBL_MAX + (1.1 >> (1023 - 106) + 0)) = fcInfinity
4592 std::make_tuple(0x7fefffffffffffffull
, 0x7c8ffffffffffffeull
,
4593 0x7948000000000000ull
, 0ull, APFloat::fcInfinity
,
4594 APFloat::rmNearestTiesToEven
),
4595 // TODO: change the 4th 0x75effffffffffffe to 0x75efffffffffffff when
4596 // semPPCDoubleDoubleLegacy is gone.
4597 // LDBL_MAX + (1.011111... >> (1023 - 106) + (1.1111111...0 >> (1023 -
4598 // 160))) = fcNormal
4599 std::make_tuple(0x7fefffffffffffffull
, 0x7c8ffffffffffffeull
,
4600 0x7947ffffffffffffull
, 0x75effffffffffffeull
,
4601 APFloat::fcNormal
, APFloat::rmNearestTiesToEven
),
4602 // LDBL_MAX + (1.1 >> (1023 - 106) + 0)) = fcInfinity
4603 std::make_tuple(0x7fefffffffffffffull
, 0x7c8ffffffffffffeull
,
4604 0x7fefffffffffffffull
, 0x7c8ffffffffffffeull
,
4605 APFloat::fcInfinity
, APFloat::rmNearestTiesToEven
),
4606 // NaN + (1 + 0) = fcNaN
4607 std::make_tuple(0x7ff8000000000000ull
, 0, 0x3ff0000000000000ull
, 0,
4608 APFloat::fcNaN
, APFloat::rmNearestTiesToEven
),
4611 for (auto Tp
: Data
) {
4612 uint64_t Op1
[2], Op2
[2];
4613 APFloat::fltCategory Expected
;
4614 APFloat::roundingMode RM
;
4615 std::tie(Op1
[0], Op1
[1], Op2
[0], Op2
[1], Expected
, RM
) = Tp
;
4618 APFloat
A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1
));
4619 APFloat
A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2
));
4622 EXPECT_EQ(Expected
, A1
.getCategory())
4623 << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op1
[0], Op1
[1],
4628 APFloat
A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1
));
4629 APFloat
A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2
));
4632 EXPECT_EQ(Expected
, A2
.getCategory())
4633 << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op2
[0], Op2
[1],
4640 TEST(APFloatTest
, PPCDoubleDoubleAdd
) {
4641 using DataType
= std::tuple
<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t,
4642 uint64_t, APFloat::roundingMode
>;
4644 // (1 + 0) + (1e-105 + 0) = (1 + 1e-105)
4645 std::make_tuple(0x3ff0000000000000ull
, 0, 0x3960000000000000ull
, 0,
4646 0x3ff0000000000000ull
, 0x3960000000000000ull
,
4647 APFloat::rmNearestTiesToEven
),
4648 // (1 + 0) + (1e-106 + 0) = (1 + 1e-106)
4649 std::make_tuple(0x3ff0000000000000ull
, 0, 0x3950000000000000ull
, 0,
4650 0x3ff0000000000000ull
, 0x3950000000000000ull
,
4651 APFloat::rmNearestTiesToEven
),
4652 // (1 + 1e-106) + (1e-106 + 0) = (1 + 1e-105)
4653 std::make_tuple(0x3ff0000000000000ull
, 0x3950000000000000ull
,
4654 0x3950000000000000ull
, 0, 0x3ff0000000000000ull
,
4655 0x3960000000000000ull
, APFloat::rmNearestTiesToEven
),
4656 // (1 + 0) + (epsilon + 0) = (1 + epsilon)
4657 std::make_tuple(0x3ff0000000000000ull
, 0, 0x0000000000000001ull
, 0,
4658 0x3ff0000000000000ull
, 0x0000000000000001ull
,
4659 APFloat::rmNearestTiesToEven
),
4660 // TODO: change 0xf950000000000000 to 0xf940000000000000, when
4661 // semPPCDoubleDoubleLegacy is gone.
4662 // (DBL_MAX - 1 << (1023 - 105)) + (1 << (1023 - 53) + 0) = DBL_MAX +
4663 // 1.11111... << (1023 - 52)
4664 std::make_tuple(0x7fefffffffffffffull
, 0xf950000000000000ull
,
4665 0x7c90000000000000ull
, 0, 0x7fefffffffffffffull
,
4666 0x7c8ffffffffffffeull
, APFloat::rmNearestTiesToEven
),
4667 // TODO: change 0xf950000000000000 to 0xf940000000000000, when
4668 // semPPCDoubleDoubleLegacy is gone.
4669 // (1 << (1023 - 53) + 0) + (DBL_MAX - 1 << (1023 - 105)) = DBL_MAX +
4670 // 1.11111... << (1023 - 52)
4671 std::make_tuple(0x7c90000000000000ull
, 0, 0x7fefffffffffffffull
,
4672 0xf950000000000000ull
, 0x7fefffffffffffffull
,
4673 0x7c8ffffffffffffeull
, APFloat::rmNearestTiesToEven
),
4676 for (auto Tp
: Data
) {
4677 uint64_t Op1
[2], Op2
[2], Expected
[2];
4678 APFloat::roundingMode RM
;
4679 std::tie(Op1
[0], Op1
[1], Op2
[0], Op2
[1], Expected
[0], Expected
[1], RM
) = Tp
;
4682 APFloat
A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1
));
4683 APFloat
A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2
));
4686 EXPECT_EQ(Expected
[0], A1
.bitcastToAPInt().getRawData()[0])
4687 << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op1
[0], Op1
[1],
4690 EXPECT_EQ(Expected
[1], A1
.bitcastToAPInt().getRawData()[1])
4691 << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op1
[0], Op1
[1],
4696 APFloat
A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1
));
4697 APFloat
A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2
));
4700 EXPECT_EQ(Expected
[0], A2
.bitcastToAPInt().getRawData()[0])
4701 << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op2
[0], Op2
[1],
4704 EXPECT_EQ(Expected
[1], A2
.bitcastToAPInt().getRawData()[1])
4705 << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op2
[0], Op2
[1],
4712 TEST(APFloatTest
, PPCDoubleDoubleSubtract
) {
4713 using DataType
= std::tuple
<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t,
4714 uint64_t, APFloat::roundingMode
>;
4716 // (1 + 0) - (-1e-105 + 0) = (1 + 1e-105)
4717 std::make_tuple(0x3ff0000000000000ull
, 0, 0xb960000000000000ull
, 0,
4718 0x3ff0000000000000ull
, 0x3960000000000000ull
,
4719 APFloat::rmNearestTiesToEven
),
4720 // (1 + 0) - (-1e-106 + 0) = (1 + 1e-106)
4721 std::make_tuple(0x3ff0000000000000ull
, 0, 0xb950000000000000ull
, 0,
4722 0x3ff0000000000000ull
, 0x3950000000000000ull
,
4723 APFloat::rmNearestTiesToEven
),
4726 for (auto Tp
: Data
) {
4727 uint64_t Op1
[2], Op2
[2], Expected
[2];
4728 APFloat::roundingMode RM
;
4729 std::tie(Op1
[0], Op1
[1], Op2
[0], Op2
[1], Expected
[0], Expected
[1], RM
) = Tp
;
4731 APFloat
A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1
));
4732 APFloat
A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2
));
4733 A1
.subtract(A2
, RM
);
4735 EXPECT_EQ(Expected
[0], A1
.bitcastToAPInt().getRawData()[0])
4736 << formatv("({0:x} + {1:x}) - ({2:x} + {3:x})", Op1
[0], Op1
[1], Op2
[0],
4739 EXPECT_EQ(Expected
[1], A1
.bitcastToAPInt().getRawData()[1])
4740 << formatv("({0:x} + {1:x}) - ({2:x} + {3:x})", Op1
[0], Op1
[1], Op2
[0],
4746 TEST(APFloatTest
, PPCDoubleDoubleMultiplySpecial
) {
4747 using DataType
= std::tuple
<uint64_t, uint64_t, uint64_t, uint64_t,
4748 APFloat::fltCategory
, APFloat::roundingMode
>;
4750 // fcNaN * fcNaN = fcNaN
4751 std::make_tuple(0x7ff8000000000000ull
, 0, 0x7ff8000000000000ull
, 0,
4752 APFloat::fcNaN
, APFloat::rmNearestTiesToEven
),
4753 // fcNaN * fcZero = fcNaN
4754 std::make_tuple(0x7ff8000000000000ull
, 0, 0, 0, APFloat::fcNaN
,
4755 APFloat::rmNearestTiesToEven
),
4756 // fcNaN * fcInfinity = fcNaN
4757 std::make_tuple(0x7ff8000000000000ull
, 0, 0x7ff0000000000000ull
, 0,
4758 APFloat::fcNaN
, APFloat::rmNearestTiesToEven
),
4759 // fcNaN * fcNormal = fcNaN
4760 std::make_tuple(0x7ff8000000000000ull
, 0, 0x3ff0000000000000ull
, 0,
4761 APFloat::fcNaN
, APFloat::rmNearestTiesToEven
),
4762 // fcInfinity * fcInfinity = fcInfinity
4763 std::make_tuple(0x7ff0000000000000ull
, 0, 0x7ff0000000000000ull
, 0,
4764 APFloat::fcInfinity
, APFloat::rmNearestTiesToEven
),
4765 // fcInfinity * fcZero = fcNaN
4766 std::make_tuple(0x7ff0000000000000ull
, 0, 0, 0, APFloat::fcNaN
,
4767 APFloat::rmNearestTiesToEven
),
4768 // fcInfinity * fcNormal = fcInfinity
4769 std::make_tuple(0x7ff0000000000000ull
, 0, 0x3ff0000000000000ull
, 0,
4770 APFloat::fcInfinity
, APFloat::rmNearestTiesToEven
),
4771 // fcZero * fcZero = fcZero
4772 std::make_tuple(0, 0, 0, 0, APFloat::fcZero
,
4773 APFloat::rmNearestTiesToEven
),
4774 // fcZero * fcNormal = fcZero
4775 std::make_tuple(0, 0, 0x3ff0000000000000ull
, 0, APFloat::fcZero
,
4776 APFloat::rmNearestTiesToEven
),
4779 for (auto Tp
: Data
) {
4780 uint64_t Op1
[2], Op2
[2];
4781 APFloat::fltCategory Expected
;
4782 APFloat::roundingMode RM
;
4783 std::tie(Op1
[0], Op1
[1], Op2
[0], Op2
[1], Expected
, RM
) = Tp
;
4786 APFloat
A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1
));
4787 APFloat
A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2
));
4788 A1
.multiply(A2
, RM
);
4790 EXPECT_EQ(Expected
, A1
.getCategory())
4791 << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op1
[0], Op1
[1],
4796 APFloat
A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1
));
4797 APFloat
A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2
));
4798 A2
.multiply(A1
, RM
);
4800 EXPECT_EQ(Expected
, A2
.getCategory())
4801 << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op2
[0], Op2
[1],
4808 TEST(APFloatTest
, PPCDoubleDoubleMultiply
) {
4809 using DataType
= std::tuple
<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t,
4810 uint64_t, APFloat::roundingMode
>;
4813 std::make_tuple(0x3fd5555555555555ull
, 0x3c75555555555556ull
,
4814 0x4008000000000000ull
, 0, 0x3ff0000000000000ull
, 0,
4815 APFloat::rmNearestTiesToEven
),
4816 // (1 + epsilon) * (1 + 0) = fcZero
4817 std::make_tuple(0x3ff0000000000000ull
, 0x0000000000000001ull
,
4818 0x3ff0000000000000ull
, 0, 0x3ff0000000000000ull
,
4819 0x0000000000000001ull
, APFloat::rmNearestTiesToEven
),
4820 // (1 + epsilon) * (1 + epsilon) = 1 + 2 * epsilon
4821 std::make_tuple(0x3ff0000000000000ull
, 0x0000000000000001ull
,
4822 0x3ff0000000000000ull
, 0x0000000000000001ull
,
4823 0x3ff0000000000000ull
, 0x0000000000000002ull
,
4824 APFloat::rmNearestTiesToEven
),
4825 // -(1 + epsilon) * (1 + epsilon) = -1
4826 std::make_tuple(0xbff0000000000000ull
, 0x0000000000000001ull
,
4827 0x3ff0000000000000ull
, 0x0000000000000001ull
,
4828 0xbff0000000000000ull
, 0, APFloat::rmNearestTiesToEven
),
4829 // (0.5 + 0) * (1 + 2 * epsilon) = 0.5 + epsilon
4830 std::make_tuple(0x3fe0000000000000ull
, 0, 0x3ff0000000000000ull
,
4831 0x0000000000000002ull
, 0x3fe0000000000000ull
,
4832 0x0000000000000001ull
, APFloat::rmNearestTiesToEven
),
4833 // (0.5 + 0) * (1 + epsilon) = 0.5
4834 std::make_tuple(0x3fe0000000000000ull
, 0, 0x3ff0000000000000ull
,
4835 0x0000000000000001ull
, 0x3fe0000000000000ull
, 0,
4836 APFloat::rmNearestTiesToEven
),
4837 // __LDBL_MAX__ * (1 + 1 << 106) = inf
4838 std::make_tuple(0x7fefffffffffffffull
, 0x7c8ffffffffffffeull
,
4839 0x3ff0000000000000ull
, 0x3950000000000000ull
,
4840 0x7ff0000000000000ull
, 0, APFloat::rmNearestTiesToEven
),
4841 // __LDBL_MAX__ * (1 + 1 << 107) > __LDBL_MAX__, but not inf, yes =_=|||
4842 std::make_tuple(0x7fefffffffffffffull
, 0x7c8ffffffffffffeull
,
4843 0x3ff0000000000000ull
, 0x3940000000000000ull
,
4844 0x7fefffffffffffffull
, 0x7c8fffffffffffffull
,
4845 APFloat::rmNearestTiesToEven
),
4846 // __LDBL_MAX__ * (1 + 1 << 108) = __LDBL_MAX__
4847 std::make_tuple(0x7fefffffffffffffull
, 0x7c8ffffffffffffeull
,
4848 0x3ff0000000000000ull
, 0x3930000000000000ull
,
4849 0x7fefffffffffffffull
, 0x7c8ffffffffffffeull
,
4850 APFloat::rmNearestTiesToEven
),
4853 for (auto Tp
: Data
) {
4854 uint64_t Op1
[2], Op2
[2], Expected
[2];
4855 APFloat::roundingMode RM
;
4856 std::tie(Op1
[0], Op1
[1], Op2
[0], Op2
[1], Expected
[0], Expected
[1], RM
) = Tp
;
4859 APFloat
A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1
));
4860 APFloat
A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2
));
4861 A1
.multiply(A2
, RM
);
4863 EXPECT_EQ(Expected
[0], A1
.bitcastToAPInt().getRawData()[0])
4864 << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op1
[0], Op1
[1],
4867 EXPECT_EQ(Expected
[1], A1
.bitcastToAPInt().getRawData()[1])
4868 << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op1
[0], Op1
[1],
4873 APFloat
A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1
));
4874 APFloat
A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2
));
4875 A2
.multiply(A1
, RM
);
4877 EXPECT_EQ(Expected
[0], A2
.bitcastToAPInt().getRawData()[0])
4878 << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op2
[0], Op2
[1],
4881 EXPECT_EQ(Expected
[1], A2
.bitcastToAPInt().getRawData()[1])
4882 << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op2
[0], Op2
[1],
4889 TEST(APFloatTest
, PPCDoubleDoubleDivide
) {
4890 using DataType
= std::tuple
<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t,
4891 uint64_t, APFloat::roundingMode
>;
4892 // TODO: Only a sanity check for now. Add more edge cases when the
4893 // double-double algorithm is implemented.
4896 std::make_tuple(0x3ff0000000000000ull
, 0, 0x4008000000000000ull
, 0,
4897 0x3fd5555555555555ull
, 0x3c75555555555556ull
,
4898 APFloat::rmNearestTiesToEven
),
4901 for (auto Tp
: Data
) {
4902 uint64_t Op1
[2], Op2
[2], Expected
[2];
4903 APFloat::roundingMode RM
;
4904 std::tie(Op1
[0], Op1
[1], Op2
[0], Op2
[1], Expected
[0], Expected
[1], RM
) = Tp
;
4906 APFloat
A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1
));
4907 APFloat
A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2
));
4910 EXPECT_EQ(Expected
[0], A1
.bitcastToAPInt().getRawData()[0])
4911 << formatv("({0:x} + {1:x}) / ({2:x} + {3:x})", Op1
[0], Op1
[1], Op2
[0],
4914 EXPECT_EQ(Expected
[1], A1
.bitcastToAPInt().getRawData()[1])
4915 << formatv("({0:x} + {1:x}) / ({2:x} + {3:x})", Op1
[0], Op1
[1], Op2
[0],
4921 TEST(APFloatTest
, PPCDoubleDoubleRemainder
) {
4923 std::tuple
<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t>;
4925 // remainder(3.0 + 3.0 << 53, 1.25 + 1.25 << 53) = (0.5 + 0.5 << 53)
4926 std::make_tuple(0x4008000000000000ull
, 0x3cb8000000000000ull
,
4927 0x3ff4000000000000ull
, 0x3ca4000000000000ull
,
4928 0x3fe0000000000000ull
, 0x3c90000000000000ull
),
4929 // remainder(3.0 + 3.0 << 53, 1.75 + 1.75 << 53) = (-0.5 - 0.5 << 53)
4930 std::make_tuple(0x4008000000000000ull
, 0x3cb8000000000000ull
,
4931 0x3ffc000000000000ull
, 0x3cac000000000000ull
,
4932 0xbfe0000000000000ull
, 0xbc90000000000000ull
),
4935 for (auto Tp
: Data
) {
4936 uint64_t Op1
[2], Op2
[2], Expected
[2];
4937 std::tie(Op1
[0], Op1
[1], Op2
[0], Op2
[1], Expected
[0], Expected
[1]) = Tp
;
4939 APFloat
A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1
));
4940 APFloat
A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2
));
4943 EXPECT_EQ(Expected
[0], A1
.bitcastToAPInt().getRawData()[0])
4944 << formatv("remainder({0:x} + {1:x}), ({2:x} + {3:x}))", Op1
[0], Op1
[1],
4947 EXPECT_EQ(Expected
[1], A1
.bitcastToAPInt().getRawData()[1])
4948 << formatv("remainder(({0:x} + {1:x}), ({2:x} + {3:x}))", Op1
[0],
4949 Op1
[1], Op2
[0], Op2
[1])
4954 TEST(APFloatTest
, PPCDoubleDoubleMod
) {
4956 std::tuple
<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t>;
4958 // mod(3.0 + 3.0 << 53, 1.25 + 1.25 << 53) = (0.5 + 0.5 << 53)
4959 std::make_tuple(0x4008000000000000ull
, 0x3cb8000000000000ull
,
4960 0x3ff4000000000000ull
, 0x3ca4000000000000ull
,
4961 0x3fe0000000000000ull
, 0x3c90000000000000ull
),
4962 // mod(3.0 + 3.0 << 53, 1.75 + 1.75 << 53) = (1.25 + 1.25 << 53)
4963 // 0xbc98000000000000 doesn't seem right, but it's what we currently have.
4964 // TODO: investigate
4965 std::make_tuple(0x4008000000000000ull
, 0x3cb8000000000000ull
,
4966 0x3ffc000000000000ull
, 0x3cac000000000000ull
,
4967 0x3ff4000000000001ull
, 0xbc98000000000000ull
),
4970 for (auto Tp
: Data
) {
4971 uint64_t Op1
[2], Op2
[2], Expected
[2];
4972 std::tie(Op1
[0], Op1
[1], Op2
[0], Op2
[1], Expected
[0], Expected
[1]) = Tp
;
4974 APFloat
A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1
));
4975 APFloat
A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2
));
4978 EXPECT_EQ(Expected
[0], A1
.bitcastToAPInt().getRawData()[0])
4979 << formatv("fmod(({0:x} + {1:x}), ({2:x} + {3:x}))", Op1
[0], Op1
[1],
4982 EXPECT_EQ(Expected
[1], A1
.bitcastToAPInt().getRawData()[1])
4983 << formatv("fmod(({0:x} + {1:x}), ({2:x} + {3:x}))", Op1
[0], Op1
[1],
4989 TEST(APFloatTest
, PPCDoubleDoubleFMA
) {
4990 // Sanity check for now.
4991 APFloat
A(APFloat::PPCDoubleDouble(), "2");
4992 A
.fusedMultiplyAdd(APFloat(APFloat::PPCDoubleDouble(), "3"),
4993 APFloat(APFloat::PPCDoubleDouble(), "4"),
4994 APFloat::rmNearestTiesToEven
);
4995 EXPECT_EQ(APFloat::cmpEqual
,
4996 APFloat(APFloat::PPCDoubleDouble(), "10").compare(A
));
4999 TEST(APFloatTest
, PPCDoubleDoubleRoundToIntegral
) {
5001 APFloat
A(APFloat::PPCDoubleDouble(), "1.5");
5002 A
.roundToIntegral(APFloat::rmNearestTiesToEven
);
5003 EXPECT_EQ(APFloat::cmpEqual
,
5004 APFloat(APFloat::PPCDoubleDouble(), "2").compare(A
));
5007 APFloat
A(APFloat::PPCDoubleDouble(), "2.5");
5008 A
.roundToIntegral(APFloat::rmNearestTiesToEven
);
5009 EXPECT_EQ(APFloat::cmpEqual
,
5010 APFloat(APFloat::PPCDoubleDouble(), "2").compare(A
));
5014 TEST(APFloatTest
, PPCDoubleDoubleCompare
) {
5016 std::tuple
<uint64_t, uint64_t, uint64_t, uint64_t, APFloat::cmpResult
>;
5019 // (1 + 0) = (1 + 0)
5020 std::make_tuple(0x3ff0000000000000ull
, 0, 0x3ff0000000000000ull
, 0,
5022 // (1 + 0) < (1.00...1 + 0)
5023 std::make_tuple(0x3ff0000000000000ull
, 0, 0x3ff0000000000001ull
, 0,
5024 APFloat::cmpLessThan
),
5025 // (1.00...1 + 0) > (1 + 0)
5026 std::make_tuple(0x3ff0000000000001ull
, 0, 0x3ff0000000000000ull
, 0,
5027 APFloat::cmpGreaterThan
),
5028 // (1 + 0) < (1 + epsilon)
5029 std::make_tuple(0x3ff0000000000000ull
, 0, 0x3ff0000000000001ull
,
5030 0x0000000000000001ull
, APFloat::cmpLessThan
),
5032 std::make_tuple(0x7ff8000000000000ull
, 0, 0x7ff8000000000000ull
, 0,
5033 APFloat::cmpUnordered
),
5035 std::make_tuple(0x3ff0000000000000ull
, 0, 0x7ff8000000000000ull
, 0,
5036 APFloat::cmpUnordered
),
5038 std::make_tuple(0x7ff0000000000000ull
, 0, 0x7ff0000000000000ull
, 0,
5042 for (auto Tp
: Data
) {
5043 uint64_t Op1
[2], Op2
[2];
5044 APFloat::cmpResult Expected
;
5045 std::tie(Op1
[0], Op1
[1], Op2
[0], Op2
[1], Expected
) = Tp
;
5047 APFloat
A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1
));
5048 APFloat
A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2
));
5049 EXPECT_EQ(Expected
, A1
.compare(A2
))
5050 << formatv("compare(({0:x} + {1:x}), ({2:x} + {3:x}))", Op1
[0], Op1
[1],
5056 TEST(APFloatTest
, PPCDoubleDoubleBitwiseIsEqual
) {
5057 using DataType
= std::tuple
<uint64_t, uint64_t, uint64_t, uint64_t, bool>;
5060 // (1 + 0) = (1 + 0)
5061 std::make_tuple(0x3ff0000000000000ull
, 0, 0x3ff0000000000000ull
, 0, true),
5062 // (1 + 0) != (1.00...1 + 0)
5063 std::make_tuple(0x3ff0000000000000ull
, 0, 0x3ff0000000000001ull
, 0,
5066 std::make_tuple(0x7ff8000000000000ull
, 0, 0x7ff8000000000000ull
, 0, true),
5067 // NaN != NaN with a different bit pattern
5068 std::make_tuple(0x7ff8000000000000ull
, 0, 0x7ff8000000000000ull
,
5069 0x3ff0000000000000ull
, false),
5071 std::make_tuple(0x7ff0000000000000ull
, 0, 0x7ff0000000000000ull
, 0, true),
5074 for (auto Tp
: Data
) {
5075 uint64_t Op1
[2], Op2
[2];
5077 std::tie(Op1
[0], Op1
[1], Op2
[0], Op2
[1], Expected
) = Tp
;
5079 APFloat
A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1
));
5080 APFloat
A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2
));
5081 EXPECT_EQ(Expected
, A1
.bitwiseIsEqual(A2
))
5082 << formatv("({0:x} + {1:x}) = ({2:x} + {3:x})", Op1
[0], Op1
[1], Op2
[0],
5088 TEST(APFloatTest
, PPCDoubleDoubleHashValue
) {
5089 uint64_t Data1
[] = {0x3ff0000000000001ull
, 0x0000000000000001ull
};
5090 uint64_t Data2
[] = {0x3ff0000000000001ull
, 0};
5091 // The hash values are *hopefully* different.
5093 hash_value(APFloat(APFloat::PPCDoubleDouble(), APInt(128, 2, Data1
))),
5094 hash_value(APFloat(APFloat::PPCDoubleDouble(), APInt(128, 2, Data2
))));
5097 TEST(APFloatTest
, PPCDoubleDoubleChangeSign
) {
5099 0x400f000000000000ull
, 0xbcb0000000000000ull
,
5101 APFloat
Float(APFloat::PPCDoubleDouble(), APInt(128, 2, Data
));
5104 APFloat::copySign(Float
, APFloat(APFloat::IEEEdouble(), "1"));
5105 EXPECT_EQ(0x400f000000000000ull
, Actual
.bitcastToAPInt().getRawData()[0]);
5106 EXPECT_EQ(0xbcb0000000000000ull
, Actual
.bitcastToAPInt().getRawData()[1]);
5110 APFloat::copySign(Float
, APFloat(APFloat::IEEEdouble(), "-1"));
5111 EXPECT_EQ(0xc00f000000000000ull
, Actual
.bitcastToAPInt().getRawData()[0]);
5112 EXPECT_EQ(0x3cb0000000000000ull
, Actual
.bitcastToAPInt().getRawData()[1]);
5116 TEST(APFloatTest
, PPCDoubleDoubleFactories
) {
5121 EXPECT_EQ(APInt(128, 2, Data
),
5122 APFloat::getZero(APFloat::PPCDoubleDouble()).bitcastToAPInt());
5126 0x7fefffffffffffffull
, 0x7c8ffffffffffffeull
,
5128 EXPECT_EQ(APInt(128, 2, Data
),
5129 APFloat::getLargest(APFloat::PPCDoubleDouble()).bitcastToAPInt());
5133 0x0000000000000001ull
, 0,
5136 APInt(128, 2, Data
),
5137 APFloat::getSmallest(APFloat::PPCDoubleDouble()).bitcastToAPInt());
5140 uint64_t Data
[] = {0x0360000000000000ull
, 0};
5141 EXPECT_EQ(APInt(128, 2, Data
),
5142 APFloat::getSmallestNormalized(APFloat::PPCDoubleDouble())
5147 0x8000000000000000ull
, 0x0000000000000000ull
,
5150 APInt(128, 2, Data
),
5151 APFloat::getZero(APFloat::PPCDoubleDouble(), true).bitcastToAPInt());
5155 0xffefffffffffffffull
, 0xfc8ffffffffffffeull
,
5158 APInt(128, 2, Data
),
5159 APFloat::getLargest(APFloat::PPCDoubleDouble(), true).bitcastToAPInt());
5163 0x8000000000000001ull
, 0x0000000000000000ull
,
5165 EXPECT_EQ(APInt(128, 2, Data
),
5166 APFloat::getSmallest(APFloat::PPCDoubleDouble(), true)
5171 0x8360000000000000ull
, 0x0000000000000000ull
,
5173 EXPECT_EQ(APInt(128, 2, Data
),
5174 APFloat::getSmallestNormalized(APFloat::PPCDoubleDouble(), true)
5177 EXPECT_TRUE(APFloat::getSmallest(APFloat::PPCDoubleDouble()).isSmallest());
5178 EXPECT_TRUE(APFloat::getLargest(APFloat::PPCDoubleDouble()).isLargest());
5181 TEST(APFloatTest
, PPCDoubleDoubleIsDenormal
) {
5182 EXPECT_TRUE(APFloat::getSmallest(APFloat::PPCDoubleDouble()).isDenormal());
5183 EXPECT_FALSE(APFloat::getLargest(APFloat::PPCDoubleDouble()).isDenormal());
5185 APFloat::getSmallestNormalized(APFloat::PPCDoubleDouble()).isDenormal());
5187 // (4 + 3) is not normalized
5189 0x4010000000000000ull
, 0x4008000000000000ull
,
5192 APFloat(APFloat::PPCDoubleDouble(), APInt(128, 2, Data
)).isDenormal());
5196 TEST(APFloatTest
, PPCDoubleDoubleScalbn
) {
5198 uint64_t Input
[] = {
5199 0x4008000000000000ull
, 0x3cb8000000000000ull
,
5202 scalbn(APFloat(APFloat::PPCDoubleDouble(), APInt(128, 2, Input
)), 1,
5203 APFloat::rmNearestTiesToEven
);
5205 EXPECT_EQ(0x4018000000000000ull
, Result
.bitcastToAPInt().getRawData()[0]);
5206 EXPECT_EQ(0x3cc8000000000000ull
, Result
.bitcastToAPInt().getRawData()[1]);
5209 TEST(APFloatTest
, PPCDoubleDoubleFrexp
) {
5211 uint64_t Input
[] = {
5212 0x4008000000000000ull
, 0x3cb8000000000000ull
,
5215 // 0.75 + 0.75 << 53
5217 frexp(APFloat(APFloat::PPCDoubleDouble(), APInt(128, 2, Input
)), Exp
,
5218 APFloat::rmNearestTiesToEven
);
5220 EXPECT_EQ(0x3fe8000000000000ull
, Result
.bitcastToAPInt().getRawData()[0]);
5221 EXPECT_EQ(0x3c98000000000000ull
, Result
.bitcastToAPInt().getRawData()[1]);
5224 TEST(APFloatTest
, x87Largest
) {
5225 APFloat MaxX87Val
= APFloat::getLargest(APFloat::x87DoubleExtended());
5226 EXPECT_TRUE(MaxX87Val
.isLargest());
5229 TEST(APFloatTest
, x87Next
) {
5230 APFloat
F(APFloat::x87DoubleExtended(), "-1.0");
5232 EXPECT_TRUE(ilogb(F
) == -1);
5235 TEST(APFloatTest
, Float8ExhaustivePair
) {
5236 // Test each pair of 8-bit floats with non-standard semantics
5237 for (APFloat::Semantics Sem
:
5238 {APFloat::S_Float8E4M3FN
, APFloat::S_Float8E5M2FNUZ
,
5239 APFloat::S_Float8E4M3FNUZ
, APFloat::S_Float8E4M3B11FNUZ
}) {
5240 const llvm::fltSemantics
&S
= APFloat::EnumToSemantics(Sem
);
5241 for (int i
= 0; i
< 256; i
++) {
5242 for (int j
= 0; j
< 256; j
++) {
5243 SCOPED_TRACE("sem=" + std::to_string(Sem
) + ",i=" + std::to_string(i
) +
5244 ",j=" + std::to_string(j
));
5245 APFloat
x(S
, APInt(8, i
));
5246 APFloat
y(S
, APInt(8, j
));
5250 x16
.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven
,
5252 EXPECT_FALSE(losesInfo
);
5254 y16
.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven
,
5256 EXPECT_FALSE(losesInfo
);
5260 z
.add(y
, APFloat::rmNearestTiesToEven
);
5262 z16
.add(y16
, APFloat::rmNearestTiesToEven
);
5263 z16
.convert(S
, APFloat::rmNearestTiesToEven
, &losesInfo
);
5264 EXPECT_TRUE(z
.bitwiseIsEqual(z16
))
5265 << "sem=" << Sem
<< ", i=" << i
<< ", j=" << j
;
5269 z
.subtract(y
, APFloat::rmNearestTiesToEven
);
5271 z16
.subtract(y16
, APFloat::rmNearestTiesToEven
);
5272 z16
.convert(S
, APFloat::rmNearestTiesToEven
, &losesInfo
);
5273 EXPECT_TRUE(z
.bitwiseIsEqual(z16
))
5274 << "sem=" << Sem
<< ", i=" << i
<< ", j=" << j
;
5278 z
.multiply(y
, APFloat::rmNearestTiesToEven
);
5280 z16
.multiply(y16
, APFloat::rmNearestTiesToEven
);
5281 z16
.convert(S
, APFloat::rmNearestTiesToEven
, &losesInfo
);
5282 EXPECT_TRUE(z
.bitwiseIsEqual(z16
))
5283 << "sem=" << Sem
<< ", i=" << i
<< ", j=" << j
;
5287 z
.divide(y
, APFloat::rmNearestTiesToEven
);
5289 z16
.divide(y16
, APFloat::rmNearestTiesToEven
);
5290 z16
.convert(S
, APFloat::rmNearestTiesToEven
, &losesInfo
);
5291 EXPECT_TRUE(z
.bitwiseIsEqual(z16
))
5292 << "sem=" << Sem
<< ", i=" << i
<< ", j=" << j
;
5299 z16
.convert(S
, APFloat::rmNearestTiesToEven
, &losesInfo
);
5300 EXPECT_TRUE(z
.bitwiseIsEqual(z16
))
5301 << "sem=" << Sem
<< ", i=" << i
<< ", j=" << j
;
5308 z16
.convert(S
, APFloat::rmNearestTiesToEven
, &losesInfo
);
5309 EXPECT_TRUE(z
.bitwiseIsEqual(z16
))
5310 << "sem=" << Sem
<< ", i=" << i
<< ", j=" << j
;
5316 TEST(APFloatTest
, Float6ExhaustivePair
) {
5317 // Test each pair of 6-bit floats with non-standard semantics
5318 for (APFloat::Semantics Sem
:
5319 {APFloat::S_Float6E3M2FN
, APFloat::S_Float6E2M3FN
}) {
5320 const llvm::fltSemantics
&S
= APFloat::EnumToSemantics(Sem
);
5321 for (int i
= 1; i
< 64; i
++) {
5322 for (int j
= 1; j
< 64; j
++) {
5323 SCOPED_TRACE("sem=" + std::to_string(Sem
) + ",i=" + std::to_string(i
) +
5324 ",j=" + std::to_string(j
));
5325 APFloat
x(S
, APInt(6, i
));
5326 APFloat
y(S
, APInt(6, j
));
5330 x16
.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven
,
5332 EXPECT_FALSE(losesInfo
);
5334 y16
.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven
,
5336 EXPECT_FALSE(losesInfo
);
5340 z
.add(y
, APFloat::rmNearestTiesToEven
);
5342 z16
.add(y16
, APFloat::rmNearestTiesToEven
);
5343 z16
.convert(S
, APFloat::rmNearestTiesToEven
, &losesInfo
);
5344 EXPECT_TRUE(z
.bitwiseIsEqual(z16
))
5345 << "sem=" << Sem
<< ", i=" << i
<< ", j=" << j
;
5349 z
.subtract(y
, APFloat::rmNearestTiesToEven
);
5351 z16
.subtract(y16
, APFloat::rmNearestTiesToEven
);
5352 z16
.convert(S
, APFloat::rmNearestTiesToEven
, &losesInfo
);
5353 EXPECT_TRUE(z
.bitwiseIsEqual(z16
))
5354 << "sem=" << Sem
<< ", i=" << i
<< ", j=" << j
;
5358 z
.multiply(y
, APFloat::rmNearestTiesToEven
);
5360 z16
.multiply(y16
, APFloat::rmNearestTiesToEven
);
5361 z16
.convert(S
, APFloat::rmNearestTiesToEven
, &losesInfo
);
5362 EXPECT_TRUE(z
.bitwiseIsEqual(z16
))
5363 << "sem=" << Sem
<< ", i=" << i
<< ", j=" << j
;
5366 if (j
== 0 || j
== 32)
5371 z
.divide(y
, APFloat::rmNearestTiesToEven
);
5373 z16
.divide(y16
, APFloat::rmNearestTiesToEven
);
5374 z16
.convert(S
, APFloat::rmNearestTiesToEven
, &losesInfo
);
5375 EXPECT_TRUE(z
.bitwiseIsEqual(z16
))
5376 << "sem=" << Sem
<< ", i=" << i
<< ", j=" << j
;
5383 z16
.convert(S
, APFloat::rmNearestTiesToEven
, &losesInfo
);
5384 EXPECT_TRUE(z
.bitwiseIsEqual(z16
))
5385 << "sem=" << Sem
<< ", i=" << i
<< ", j=" << j
;
5392 z16
.convert(S
, APFloat::rmNearestTiesToEven
, &losesInfo
);
5393 EXPECT_TRUE(z
.bitwiseIsEqual(z16
))
5394 << "sem=" << Sem
<< ", i=" << i
<< ", j=" << j
;
5400 TEST(APFloatTest
, Float4ExhaustivePair
) {
5401 // Test each pair of 4-bit floats with non-standard semantics
5402 for (APFloat::Semantics Sem
: {APFloat::S_Float4E2M1FN
}) {
5403 const llvm::fltSemantics
&S
= APFloat::EnumToSemantics(Sem
);
5404 for (int i
= 0; i
< 16; i
++) {
5405 for (int j
= 0; j
< 16; j
++) {
5406 SCOPED_TRACE("sem=" + std::to_string(Sem
) + ",i=" + std::to_string(i
) +
5407 ",j=" + std::to_string(j
));
5408 APFloat
x(S
, APInt(4, i
));
5409 APFloat
y(S
, APInt(4, j
));
5413 x16
.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven
,
5415 EXPECT_FALSE(losesInfo
);
5417 y16
.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven
,
5419 EXPECT_FALSE(losesInfo
);
5423 z
.add(y
, APFloat::rmNearestTiesToEven
);
5425 z16
.add(y16
, APFloat::rmNearestTiesToEven
);
5426 z16
.convert(S
, APFloat::rmNearestTiesToEven
, &losesInfo
);
5427 EXPECT_TRUE(z
.bitwiseIsEqual(z16
))
5428 << "sem=" << Sem
<< ", i=" << i
<< ", j=" << j
;
5432 z
.subtract(y
, APFloat::rmNearestTiesToEven
);
5434 z16
.subtract(y16
, APFloat::rmNearestTiesToEven
);
5435 z16
.convert(S
, APFloat::rmNearestTiesToEven
, &losesInfo
);
5436 EXPECT_TRUE(z
.bitwiseIsEqual(z16
))
5437 << "sem=" << Sem
<< ", i=" << i
<< ", j=" << j
;
5441 z
.multiply(y
, APFloat::rmNearestTiesToEven
);
5443 z16
.multiply(y16
, APFloat::rmNearestTiesToEven
);
5444 z16
.convert(S
, APFloat::rmNearestTiesToEven
, &losesInfo
);
5445 EXPECT_TRUE(z
.bitwiseIsEqual(z16
))
5446 << "sem=" << Sem
<< ", i=" << i
<< ", j=" << j
;
5449 if (j
== 0 || j
== 8)
5454 z
.divide(y
, APFloat::rmNearestTiesToEven
);
5456 z16
.divide(y16
, APFloat::rmNearestTiesToEven
);
5457 z16
.convert(S
, APFloat::rmNearestTiesToEven
, &losesInfo
);
5458 EXPECT_TRUE(z
.bitwiseIsEqual(z16
))
5459 << "sem=" << Sem
<< ", i=" << i
<< ", j=" << j
;
5466 z16
.convert(S
, APFloat::rmNearestTiesToEven
, &losesInfo
);
5467 EXPECT_TRUE(z
.bitwiseIsEqual(z16
))
5468 << "sem=" << Sem
<< ", i=" << i
<< ", j=" << j
;
5475 z16
.convert(S
, APFloat::rmNearestTiesToEven
, &losesInfo
);
5476 EXPECT_TRUE(z
.bitwiseIsEqual(z16
))
5477 << "sem=" << Sem
<< ", i=" << i
<< ", j=" << j
;
5483 TEST(APFloatTest
, ConvertE4M3FNToE5M2
) {
5485 APFloat
test(APFloat::Float8E4M3FN(), "1.0");
5486 APFloat::opStatus status
= test
.convert(
5487 APFloat::Float8E5M2(), APFloat::rmNearestTiesToEven
, &losesInfo
);
5488 EXPECT_EQ(1.0f
, test
.convertToFloat());
5489 EXPECT_FALSE(losesInfo
);
5490 EXPECT_EQ(status
, APFloat::opOK
);
5492 test
= APFloat(APFloat::Float8E4M3FN(), "0.0");
5493 status
= test
.convert(APFloat::Float8E5M2(), APFloat::rmNearestTiesToEven
,
5495 EXPECT_EQ(0.0f
, test
.convertToFloat());
5496 EXPECT_FALSE(losesInfo
);
5497 EXPECT_EQ(status
, APFloat::opOK
);
5499 test
= APFloat(APFloat::Float8E4M3FN(), "0x1.2p0"); // 1.125
5500 status
= test
.convert(APFloat::Float8E5M2(), APFloat::rmNearestTiesToEven
,
5502 EXPECT_EQ(0x1.0p0
/* 1.0 */, test
.convertToFloat());
5503 EXPECT_TRUE(losesInfo
);
5504 EXPECT_EQ(status
, APFloat::opInexact
);
5506 test
= APFloat(APFloat::Float8E4M3FN(), "0x1.6p0"); // 1.375
5507 status
= test
.convert(APFloat::Float8E5M2(), APFloat::rmNearestTiesToEven
,
5509 EXPECT_EQ(0x1.8p0
/* 1.5 */, test
.convertToFloat());
5510 EXPECT_TRUE(losesInfo
);
5511 EXPECT_EQ(status
, APFloat::opInexact
);
5513 // Convert E4M3FN denormal to E5M2 normal. Should not be truncated, despite
5514 // the destination format having one fewer significand bit
5515 test
= APFloat(APFloat::Float8E4M3FN(), "0x1.Cp-7");
5516 status
= test
.convert(APFloat::Float8E5M2(), APFloat::rmNearestTiesToEven
,
5518 EXPECT_EQ(0x1.Cp
-7, test
.convertToFloat());
5519 EXPECT_FALSE(losesInfo
);
5520 EXPECT_EQ(status
, APFloat::opOK
);
5522 // Test convert from NaN
5523 test
= APFloat(APFloat::Float8E4M3FN(), "nan");
5524 status
= test
.convert(APFloat::Float8E5M2(), APFloat::rmNearestTiesToEven
,
5526 EXPECT_TRUE(std::isnan(test
.convertToFloat()));
5527 EXPECT_FALSE(losesInfo
);
5528 EXPECT_EQ(status
, APFloat::opOK
);
5531 TEST(APFloatTest
, ConvertE5M2ToE4M3FN
) {
5533 APFloat
test(APFloat::Float8E5M2(), "1.0");
5534 APFloat::opStatus status
= test
.convert(
5535 APFloat::Float8E4M3FN(), APFloat::rmNearestTiesToEven
, &losesInfo
);
5536 EXPECT_EQ(1.0f
, test
.convertToFloat());
5537 EXPECT_FALSE(losesInfo
);
5538 EXPECT_EQ(status
, APFloat::opOK
);
5540 test
= APFloat(APFloat::Float8E5M2(), "0.0");
5541 status
= test
.convert(APFloat::Float8E4M3FN(), APFloat::rmNearestTiesToEven
,
5543 EXPECT_EQ(0.0f
, test
.convertToFloat());
5544 EXPECT_FALSE(losesInfo
);
5545 EXPECT_EQ(status
, APFloat::opOK
);
5547 test
= APFloat(APFloat::Float8E5M2(), "0x1.Cp8"); // 448
5548 status
= test
.convert(APFloat::Float8E4M3FN(), APFloat::rmNearestTiesToEven
,
5550 EXPECT_EQ(0x1.Cp8
/* 448 */, test
.convertToFloat());
5551 EXPECT_FALSE(losesInfo
);
5552 EXPECT_EQ(status
, APFloat::opOK
);
5555 test
= APFloat(APFloat::Float8E5M2(), "0x1.0p9"); // 512
5556 status
= test
.convert(APFloat::Float8E4M3FN(), APFloat::rmNearestTiesToEven
,
5558 EXPECT_TRUE(std::isnan(test
.convertToFloat()));
5559 EXPECT_TRUE(losesInfo
);
5560 EXPECT_EQ(status
, APFloat::opOverflow
| APFloat::opInexact
);
5563 test
= APFloat(APFloat::Float8E5M2(), "0x1.0p-10");
5564 status
= test
.convert(APFloat::Float8E4M3FN(), APFloat::rmNearestTiesToEven
,
5566 EXPECT_EQ(0., test
.convertToFloat());
5567 EXPECT_TRUE(losesInfo
);
5568 EXPECT_EQ(status
, APFloat::opUnderflow
| APFloat::opInexact
);
5570 // Test rounding up to smallest denormal number
5571 test
= APFloat(APFloat::Float8E5M2(), "0x1.8p-10");
5572 status
= test
.convert(APFloat::Float8E4M3FN(), APFloat::rmNearestTiesToEven
,
5574 EXPECT_EQ(0x1.0p
-9, test
.convertToFloat());
5575 EXPECT_TRUE(losesInfo
);
5576 EXPECT_EQ(status
, APFloat::opUnderflow
| APFloat::opInexact
);
5578 // Testing inexact rounding to denormal number
5579 test
= APFloat(APFloat::Float8E5M2(), "0x1.8p-9");
5580 status
= test
.convert(APFloat::Float8E4M3FN(), APFloat::rmNearestTiesToEven
,
5582 EXPECT_EQ(0x1.0p
-8, test
.convertToFloat());
5583 EXPECT_TRUE(losesInfo
);
5584 EXPECT_EQ(status
, APFloat::opUnderflow
| APFloat::opInexact
);
5586 APFloat nan
= APFloat(APFloat::Float8E4M3FN(), "nan");
5588 // Testing convert from Inf
5589 test
= APFloat(APFloat::Float8E5M2(), "inf");
5590 status
= test
.convert(APFloat::Float8E4M3FN(), APFloat::rmNearestTiesToEven
,
5592 EXPECT_TRUE(std::isnan(test
.convertToFloat()));
5593 EXPECT_TRUE(losesInfo
);
5594 EXPECT_EQ(status
, APFloat::opInexact
);
5595 EXPECT_TRUE(test
.bitwiseIsEqual(nan
));
5597 // Testing convert from quiet NaN
5598 test
= APFloat(APFloat::Float8E5M2(), "nan");
5599 status
= test
.convert(APFloat::Float8E4M3FN(), APFloat::rmNearestTiesToEven
,
5601 EXPECT_TRUE(std::isnan(test
.convertToFloat()));
5602 EXPECT_TRUE(losesInfo
);
5603 EXPECT_EQ(status
, APFloat::opOK
);
5604 EXPECT_TRUE(test
.bitwiseIsEqual(nan
));
5606 // Testing convert from signaling NaN
5607 test
= APFloat(APFloat::Float8E5M2(), "snan");
5608 status
= test
.convert(APFloat::Float8E4M3FN(), APFloat::rmNearestTiesToEven
,
5610 EXPECT_TRUE(std::isnan(test
.convertToFloat()));
5611 EXPECT_TRUE(losesInfo
);
5612 EXPECT_EQ(status
, APFloat::opInvalidOp
);
5613 EXPECT_TRUE(test
.bitwiseIsEqual(nan
));
5616 TEST(APFloatTest
, Float8E4M3FNGetInf
) {
5617 APFloat t
= APFloat::getInf(APFloat::Float8E4M3FN());
5618 EXPECT_TRUE(t
.isNaN());
5619 EXPECT_FALSE(t
.isInfinity());
5622 TEST(APFloatTest
, Float8E4M3FNFromString
) {
5623 // Exactly representable
5624 EXPECT_EQ(448, APFloat(APFloat::Float8E4M3FN(), "448").convertToDouble());
5625 // Round down to maximum value
5626 EXPECT_EQ(448, APFloat(APFloat::Float8E4M3FN(), "464").convertToDouble());
5627 // Round up, causing overflow to NaN
5628 EXPECT_TRUE(APFloat(APFloat::Float8E4M3FN(), "465").isNaN());
5629 // Overflow without rounding
5630 EXPECT_TRUE(APFloat(APFloat::Float8E4M3FN(), "480").isNaN());
5631 // Inf converted to NaN
5632 EXPECT_TRUE(APFloat(APFloat::Float8E4M3FN(), "inf").isNaN());
5633 // NaN converted to NaN
5634 EXPECT_TRUE(APFloat(APFloat::Float8E4M3FN(), "nan").isNaN());
5637 TEST(APFloatTest
, Float8E4M3FNAdd
) {
5638 APFloat QNaN
= APFloat::getNaN(APFloat::Float8E4M3FN(), false);
5640 auto FromStr
= [](StringRef S
) {
5641 return APFloat(APFloat::Float8E4M3FN(), S
);
5650 APFloat::roundingMode roundingMode
= APFloat::rmNearestTiesToEven
;
5651 } AdditionTests
[] = {
5652 // Test addition operations involving NaN, overflow, and the max E4M3FN
5653 // value (448) because E4M3FN differs from IEEE-754 types in these regards
5654 {FromStr("448"), FromStr("16"), "448", APFloat::opInexact
,
5656 {FromStr("448"), FromStr("18"), "NaN",
5657 APFloat::opOverflow
| APFloat::opInexact
, APFloat::fcNaN
},
5658 {FromStr("448"), FromStr("32"), "NaN",
5659 APFloat::opOverflow
| APFloat::opInexact
, APFloat::fcNaN
},
5660 {FromStr("-448"), FromStr("-32"), "-NaN",
5661 APFloat::opOverflow
| APFloat::opInexact
, APFloat::fcNaN
},
5662 {QNaN
, FromStr("-448"), "NaN", APFloat::opOK
, APFloat::fcNaN
},
5663 {FromStr("448"), FromStr("-32"), "416", APFloat::opOK
, APFloat::fcNormal
},
5664 {FromStr("448"), FromStr("0"), "448", APFloat::opOK
, APFloat::fcNormal
},
5665 {FromStr("448"), FromStr("32"), "448", APFloat::opInexact
,
5666 APFloat::fcNormal
, APFloat::rmTowardZero
},
5667 {FromStr("448"), FromStr("448"), "448", APFloat::opInexact
,
5668 APFloat::fcNormal
, APFloat::rmTowardZero
},
5671 for (size_t i
= 0; i
< std::size(AdditionTests
); ++i
) {
5672 APFloat
x(AdditionTests
[i
].x
);
5673 APFloat
y(AdditionTests
[i
].y
);
5674 APFloat::opStatus status
= x
.add(y
, AdditionTests
[i
].roundingMode
);
5676 APFloat
result(APFloat::Float8E4M3FN(), AdditionTests
[i
].result
);
5678 EXPECT_TRUE(result
.bitwiseIsEqual(x
));
5679 EXPECT_EQ(AdditionTests
[i
].status
, (int)status
);
5680 EXPECT_EQ(AdditionTests
[i
].category
, (int)x
.getCategory());
5684 TEST(APFloatTest
, Float8E4M3FNDivideByZero
) {
5685 APFloat
x(APFloat::Float8E4M3FN(), "1");
5686 APFloat
zero(APFloat::Float8E4M3FN(), "0");
5687 EXPECT_EQ(x
.divide(zero
, APFloat::rmNearestTiesToEven
), APFloat::opDivByZero
);
5688 EXPECT_TRUE(x
.isNaN());
5691 TEST(APFloatTest
, Float8E4M3FNNext
) {
5692 APFloat
test(APFloat::Float8E4M3FN(), APFloat::uninitialized
);
5693 APFloat
expected(APFloat::Float8E4M3FN(), APFloat::uninitialized
);
5695 // nextUp on positive numbers
5696 for (int i
= 0; i
< 127; i
++) {
5697 test
= APFloat(APFloat::Float8E4M3FN(), APInt(8, i
));
5698 expected
= APFloat(APFloat::Float8E4M3FN(), APInt(8, i
+ 1));
5699 EXPECT_EQ(test
.next(false), APFloat::opOK
);
5700 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
5703 // nextUp on negative zero
5704 test
= APFloat::getZero(APFloat::Float8E4M3FN(), true);
5705 expected
= APFloat::getSmallest(APFloat::Float8E4M3FN(), false);
5706 EXPECT_EQ(test
.next(false), APFloat::opOK
);
5707 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
5709 // nextUp on negative nonzero numbers
5710 for (int i
= 129; i
< 255; i
++) {
5711 test
= APFloat(APFloat::Float8E4M3FN(), APInt(8, i
));
5712 expected
= APFloat(APFloat::Float8E4M3FN(), APInt(8, i
- 1));
5713 EXPECT_EQ(test
.next(false), APFloat::opOK
);
5714 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
5718 test
= APFloat::getQNaN(APFloat::Float8E4M3FN(), false);
5719 expected
= APFloat::getQNaN(APFloat::Float8E4M3FN(), false);
5720 EXPECT_EQ(test
.next(false), APFloat::opOK
);
5721 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
5723 // nextDown on positive nonzero finite numbers
5724 for (int i
= 1; i
< 127; i
++) {
5725 test
= APFloat(APFloat::Float8E4M3FN(), APInt(8, i
));
5726 expected
= APFloat(APFloat::Float8E4M3FN(), APInt(8, i
- 1));
5727 EXPECT_EQ(test
.next(true), APFloat::opOK
);
5728 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
5731 // nextDown on positive zero
5732 test
= APFloat::getZero(APFloat::Float8E4M3FN(), true);
5733 expected
= APFloat::getSmallest(APFloat::Float8E4M3FN(), true);
5734 EXPECT_EQ(test
.next(true), APFloat::opOK
);
5735 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
5737 // nextDown on negative finite numbers
5738 for (int i
= 128; i
< 255; i
++) {
5739 test
= APFloat(APFloat::Float8E4M3FN(), APInt(8, i
));
5740 expected
= APFloat(APFloat::Float8E4M3FN(), APInt(8, i
+ 1));
5741 EXPECT_EQ(test
.next(true), APFloat::opOK
);
5742 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
5746 test
= APFloat::getQNaN(APFloat::Float8E4M3FN(), false);
5747 expected
= APFloat::getQNaN(APFloat::Float8E4M3FN(), false);
5748 EXPECT_EQ(test
.next(true), APFloat::opOK
);
5749 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
5752 TEST(APFloatTest
, Float8E4M3FNExhaustive
) {
5753 // Test each of the 256 Float8E4M3FN values.
5754 for (int i
= 0; i
< 256; i
++) {
5755 APFloat
test(APFloat::Float8E4M3FN(), APInt(8, i
));
5756 SCOPED_TRACE("i=" + std::to_string(i
));
5759 if (i
== 126 || i
== 254) {
5760 EXPECT_TRUE(test
.isLargest());
5761 EXPECT_EQ(abs(test
).convertToDouble(), 448.);
5763 EXPECT_FALSE(test
.isLargest());
5767 if (i
== 1 || i
== 129) {
5768 EXPECT_TRUE(test
.isSmallest());
5769 EXPECT_EQ(abs(test
).convertToDouble(), 0x1p
-9);
5771 EXPECT_FALSE(test
.isSmallest());
5774 // convert to BFloat
5775 APFloat test2
= test
;
5777 APFloat::opStatus status
= test2
.convert(
5778 APFloat::BFloat(), APFloat::rmNearestTiesToEven
, &losesInfo
);
5779 EXPECT_EQ(status
, APFloat::opOK
);
5780 EXPECT_FALSE(losesInfo
);
5781 if (i
== 127 || i
== 255)
5782 EXPECT_TRUE(test2
.isNaN());
5784 EXPECT_EQ(test
.convertToFloat(), test2
.convertToFloat());
5787 EXPECT_EQ(i
, test
.bitcastToAPInt());
5791 TEST(APFloatTest
, Float8E5M2FNUZNext
) {
5792 APFloat
test(APFloat::Float8E5M2FNUZ(), APFloat::uninitialized
);
5793 APFloat
expected(APFloat::Float8E5M2FNUZ(), APFloat::uninitialized
);
5795 // 1. NextUp of largest bit pattern is nan
5796 test
= APFloat::getLargest(APFloat::Float8E5M2FNUZ());
5797 expected
= APFloat::getNaN(APFloat::Float8E5M2FNUZ());
5798 EXPECT_EQ(test
.next(false), APFloat::opOK
);
5799 EXPECT_FALSE(test
.isInfinity());
5800 EXPECT_FALSE(test
.isZero());
5801 EXPECT_TRUE(test
.isNaN());
5802 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
5804 // 2. NextUp of smallest negative denormal is +0
5805 test
= APFloat::getSmallest(APFloat::Float8E5M2FNUZ(), true);
5806 expected
= APFloat::getZero(APFloat::Float8E5M2FNUZ(), false);
5807 EXPECT_EQ(test
.next(false), APFloat::opOK
);
5808 EXPECT_FALSE(test
.isNegZero());
5809 EXPECT_TRUE(test
.isPosZero());
5810 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
5812 // 3. nextDown of negative of largest value is NaN
5813 test
= APFloat::getLargest(APFloat::Float8E5M2FNUZ(), true);
5814 expected
= APFloat::getNaN(APFloat::Float8E5M2FNUZ());
5815 EXPECT_EQ(test
.next(true), APFloat::opOK
);
5816 EXPECT_FALSE(test
.isInfinity());
5817 EXPECT_FALSE(test
.isZero());
5818 EXPECT_TRUE(test
.isNaN());
5819 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
5821 // 4. nextDown of +0 is smallest negative denormal
5822 test
= APFloat::getZero(APFloat::Float8E5M2FNUZ(), false);
5823 expected
= APFloat::getSmallest(APFloat::Float8E5M2FNUZ(), true);
5824 EXPECT_EQ(test
.next(true), APFloat::opOK
);
5825 EXPECT_FALSE(test
.isZero());
5826 EXPECT_TRUE(test
.isDenormal());
5827 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
5829 // 5. nextUp of NaN is NaN
5830 test
= APFloat::getNaN(APFloat::Float8E5M2FNUZ(), false);
5831 expected
= APFloat::getNaN(APFloat::Float8E5M2FNUZ(), true);
5832 EXPECT_EQ(test
.next(false), APFloat::opOK
);
5833 EXPECT_TRUE(test
.isNaN());
5835 // 6. nextDown of NaN is NaN
5836 test
= APFloat::getNaN(APFloat::Float8E5M2FNUZ(), false);
5837 expected
= APFloat::getNaN(APFloat::Float8E5M2FNUZ(), true);
5838 EXPECT_EQ(test
.next(true), APFloat::opOK
);
5839 EXPECT_TRUE(test
.isNaN());
5842 TEST(APFloatTest
, Float8E5M2FNUZChangeSign
) {
5843 APFloat test
= APFloat(APFloat::Float8E5M2FNUZ(), "1.0");
5844 APFloat expected
= APFloat(APFloat::Float8E5M2FNUZ(), "-1.0");
5846 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
5848 test
= APFloat::getZero(APFloat::Float8E5M2FNUZ());
5851 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
5853 test
= APFloat::getNaN(APFloat::Float8E5M2FNUZ());
5856 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
5859 TEST(APFloatTest
, Float8E5M2FNUZFromString
) {
5860 // Exactly representable
5862 APFloat(APFloat::Float8E5M2FNUZ(), "57344").convertToDouble());
5863 // Round down to maximum value
5865 APFloat(APFloat::Float8E5M2FNUZ(), "59392").convertToDouble());
5866 // Round up, causing overflow to NaN
5867 EXPECT_TRUE(APFloat(APFloat::Float8E5M2FNUZ(), "61440").isNaN());
5868 // Overflow without rounding
5869 EXPECT_TRUE(APFloat(APFloat::Float8E5M2FNUZ(), "131072").isNaN());
5870 // Inf converted to NaN
5871 EXPECT_TRUE(APFloat(APFloat::Float8E5M2FNUZ(), "inf").isNaN());
5872 // NaN converted to NaN
5873 EXPECT_TRUE(APFloat(APFloat::Float8E5M2FNUZ(), "nan").isNaN());
5874 // Negative zero converted to positive zero
5875 EXPECT_TRUE(APFloat(APFloat::Float8E5M2FNUZ(), "-0").isPosZero());
5878 TEST(APFloatTest
, UnsignedZeroArithmeticSpecial
) {
5879 // Float semantics with only unsigned zero (ex. Float8E4M3FNUZ) violate the
5880 // IEEE rules about signs in arithmetic operations when producing zeros,
5881 // because they only have one zero. Most of the rest of the complexities of
5882 // arithmetic on these values are covered by the other Float8 types' test
5883 // cases and so are not repeated here.
5885 // The IEEE round towards negative rule doesn't apply
5886 for (APFloat::Semantics S
:
5887 {APFloat::S_Float8E4M3FNUZ
, APFloat::S_Float8E4M3B11FNUZ
}) {
5888 const llvm::fltSemantics
&Sem
= APFloat::EnumToSemantics(S
);
5889 APFloat test
= APFloat::getSmallest(Sem
);
5891 EXPECT_EQ(test
.subtract(rhs
, APFloat::rmTowardNegative
), APFloat::opOK
);
5892 EXPECT_TRUE(test
.isZero());
5893 EXPECT_FALSE(test
.isNegative());
5895 // Multiplication of (small) * (-small) is +0
5896 test
= APFloat::getSmallestNormalized(Sem
);
5898 EXPECT_EQ(test
.multiply(rhs
, APFloat::rmNearestTiesToAway
),
5899 APFloat::opInexact
| APFloat::opUnderflow
);
5900 EXPECT_TRUE(test
.isZero());
5901 EXPECT_FALSE(test
.isNegative());
5903 // Dividing the negatize float_min by anything gives +0
5904 test
= APFloat::getSmallest(Sem
, true);
5905 rhs
= APFloat(Sem
, "2.0");
5906 EXPECT_EQ(test
.divide(rhs
, APFloat::rmNearestTiesToEven
),
5907 APFloat::opInexact
| APFloat::opUnderflow
);
5908 EXPECT_TRUE(test
.isZero());
5909 EXPECT_FALSE(test
.isNegative());
5911 // Remainder can't copy sign because there's only one zero
5912 test
= APFloat(Sem
, "-4.0");
5913 rhs
= APFloat(Sem
, "2.0");
5914 EXPECT_EQ(test
.remainder(rhs
), APFloat::opOK
);
5915 EXPECT_TRUE(test
.isZero());
5916 EXPECT_FALSE(test
.isNegative());
5919 test
= APFloat(Sem
, "-4.0");
5920 rhs
= APFloat(Sem
, "2.0");
5921 EXPECT_EQ(test
.mod(rhs
), APFloat::opOK
);
5922 EXPECT_TRUE(test
.isZero());
5923 EXPECT_FALSE(test
.isNegative());
5925 // FMA correctly handles both the multiply and add parts of all this
5926 test
= APFloat(Sem
, "2.0");
5928 APFloat addend
= APFloat(Sem
, "-4.0");
5929 EXPECT_EQ(test
.fusedMultiplyAdd(rhs
, addend
, APFloat::rmTowardNegative
),
5931 EXPECT_TRUE(test
.isZero());
5932 EXPECT_FALSE(test
.isNegative());
5936 TEST(APFloatTest
, Float8E5M2FNUZAdd
) {
5937 APFloat QNaN
= APFloat::getNaN(APFloat::Float8E5M2FNUZ(), false);
5939 auto FromStr
= [](StringRef S
) {
5940 return APFloat(APFloat::Float8E5M2FNUZ(), S
);
5949 APFloat::roundingMode roundingMode
= APFloat::rmNearestTiesToEven
;
5950 } AdditionTests
[] = {
5951 // Test addition operations involving NaN, overflow, and the max E5M2FNUZ
5952 // value (57344) because E5M2FNUZ differs from IEEE-754 types in these
5954 {FromStr("57344"), FromStr("2048"), "57344", APFloat::opInexact
,
5956 {FromStr("57344"), FromStr("4096"), "NaN",
5957 APFloat::opOverflow
| APFloat::opInexact
, APFloat::fcNaN
},
5958 {FromStr("-57344"), FromStr("-4096"), "NaN",
5959 APFloat::opOverflow
| APFloat::opInexact
, APFloat::fcNaN
},
5960 {QNaN
, FromStr("-57344"), "NaN", APFloat::opOK
, APFloat::fcNaN
},
5961 {FromStr("57344"), FromStr("-8192"), "49152", APFloat::opOK
,
5963 {FromStr("57344"), FromStr("0"), "57344", APFloat::opOK
,
5965 {FromStr("57344"), FromStr("4096"), "57344", APFloat::opInexact
,
5966 APFloat::fcNormal
, APFloat::rmTowardZero
},
5967 {FromStr("57344"), FromStr("57344"), "57344", APFloat::opInexact
,
5968 APFloat::fcNormal
, APFloat::rmTowardZero
},
5971 for (size_t i
= 0; i
< std::size(AdditionTests
); ++i
) {
5972 APFloat
x(AdditionTests
[i
].x
);
5973 APFloat
y(AdditionTests
[i
].y
);
5974 APFloat::opStatus status
= x
.add(y
, AdditionTests
[i
].roundingMode
);
5976 APFloat
result(APFloat::Float8E5M2FNUZ(), AdditionTests
[i
].result
);
5978 EXPECT_TRUE(result
.bitwiseIsEqual(x
));
5979 EXPECT_EQ(AdditionTests
[i
].status
, (int)status
);
5980 EXPECT_EQ(AdditionTests
[i
].category
, (int)x
.getCategory());
5984 TEST(APFloatTest
, Float8E5M2FNUZDivideByZero
) {
5985 APFloat
x(APFloat::Float8E5M2FNUZ(), "1");
5986 APFloat
zero(APFloat::Float8E5M2FNUZ(), "0");
5987 EXPECT_EQ(x
.divide(zero
, APFloat::rmNearestTiesToEven
), APFloat::opDivByZero
);
5988 EXPECT_TRUE(x
.isNaN());
5991 TEST(APFloatTest
, Float8UnsignedZeroExhaustive
) {
5993 const fltSemantics
*semantics
;
5994 const double largest
;
5995 const double smallest
;
5996 } const exhaustiveTests
[] = {{&APFloat::Float8E5M2FNUZ(), 57344., 0x1.0p
-17},
5997 {&APFloat::Float8E4M3FNUZ(), 240., 0x1.0p
-10},
5998 {&APFloat::Float8E4M3B11FNUZ(), 30., 0x1.0p
-13}};
5999 for (const auto &testInfo
: exhaustiveTests
) {
6000 const fltSemantics
&sem
= *testInfo
.semantics
;
6001 SCOPED_TRACE("Semantics=" + std::to_string(APFloat::SemanticsToEnum(sem
)));
6002 // Test each of the 256 values.
6003 for (int i
= 0; i
< 256; i
++) {
6004 SCOPED_TRACE("i=" + std::to_string(i
));
6005 APFloat
test(sem
, APInt(8, i
));
6008 if (i
== 127 || i
== 255) {
6009 EXPECT_TRUE(test
.isLargest());
6010 EXPECT_EQ(abs(test
).convertToDouble(), testInfo
.largest
);
6012 EXPECT_FALSE(test
.isLargest());
6016 if (i
== 1 || i
== 129) {
6017 EXPECT_TRUE(test
.isSmallest());
6018 EXPECT_EQ(abs(test
).convertToDouble(), testInfo
.smallest
);
6020 EXPECT_FALSE(test
.isSmallest());
6023 // convert to BFloat
6024 APFloat test2
= test
;
6026 APFloat::opStatus status
= test2
.convert(
6027 APFloat::BFloat(), APFloat::rmNearestTiesToEven
, &losesInfo
);
6028 EXPECT_EQ(status
, APFloat::opOK
);
6029 EXPECT_FALSE(losesInfo
);
6031 EXPECT_TRUE(test2
.isNaN());
6033 EXPECT_EQ(test
.convertToFloat(), test2
.convertToFloat());
6036 EXPECT_EQ(i
, test
.bitcastToAPInt());
6041 TEST(APFloatTest
, Float8E4M3FNUZNext
) {
6042 for (APFloat::Semantics S
:
6043 {APFloat::S_Float8E4M3FNUZ
, APFloat::S_Float8E4M3B11FNUZ
}) {
6044 const llvm::fltSemantics
&Sem
= APFloat::EnumToSemantics(S
);
6045 APFloat
test(Sem
, APFloat::uninitialized
);
6046 APFloat
expected(Sem
, APFloat::uninitialized
);
6048 // 1. NextUp of largest bit pattern is nan
6049 test
= APFloat::getLargest(Sem
);
6050 expected
= APFloat::getNaN(Sem
);
6051 EXPECT_EQ(test
.next(false), APFloat::opOK
);
6052 EXPECT_FALSE(test
.isInfinity());
6053 EXPECT_FALSE(test
.isZero());
6054 EXPECT_TRUE(test
.isNaN());
6055 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
6057 // 2. NextUp of smallest negative denormal is +0
6058 test
= APFloat::getSmallest(Sem
, true);
6059 expected
= APFloat::getZero(Sem
, false);
6060 EXPECT_EQ(test
.next(false), APFloat::opOK
);
6061 EXPECT_FALSE(test
.isNegZero());
6062 EXPECT_TRUE(test
.isPosZero());
6063 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
6065 // 3. nextDown of negative of largest value is NaN
6066 test
= APFloat::getLargest(Sem
, true);
6067 expected
= APFloat::getNaN(Sem
);
6068 EXPECT_EQ(test
.next(true), APFloat::opOK
);
6069 EXPECT_FALSE(test
.isInfinity());
6070 EXPECT_FALSE(test
.isZero());
6071 EXPECT_TRUE(test
.isNaN());
6072 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
6074 // 4. nextDown of +0 is smallest negative denormal
6075 test
= APFloat::getZero(Sem
, false);
6076 expected
= APFloat::getSmallest(Sem
, true);
6077 EXPECT_EQ(test
.next(true), APFloat::opOK
);
6078 EXPECT_FALSE(test
.isZero());
6079 EXPECT_TRUE(test
.isDenormal());
6080 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
6082 // 5. nextUp of NaN is NaN
6083 test
= APFloat::getNaN(Sem
, false);
6084 expected
= APFloat::getNaN(Sem
, true);
6085 EXPECT_EQ(test
.next(false), APFloat::opOK
);
6086 EXPECT_TRUE(test
.isNaN());
6088 // 6. nextDown of NaN is NaN
6089 test
= APFloat::getNaN(Sem
, false);
6090 expected
= APFloat::getNaN(Sem
, true);
6091 EXPECT_EQ(test
.next(true), APFloat::opOK
);
6092 EXPECT_TRUE(test
.isNaN());
6096 TEST(APFloatTest
, Float8E4M3FNUZChangeSign
) {
6097 for (APFloat::Semantics S
:
6098 {APFloat::S_Float8E4M3FNUZ
, APFloat::S_Float8E4M3B11FNUZ
}) {
6099 const llvm::fltSemantics
&Sem
= APFloat::EnumToSemantics(S
);
6100 APFloat test
= APFloat(Sem
, "1.0");
6101 APFloat expected
= APFloat(Sem
, "-1.0");
6103 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
6105 test
= APFloat::getZero(Sem
);
6108 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
6110 test
= APFloat::getNaN(Sem
);
6113 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
6117 TEST(APFloatTest
, Float8E4M3FNUZFromString
) {
6118 // Exactly representable
6119 EXPECT_EQ(240, APFloat(APFloat::Float8E4M3FNUZ(), "240").convertToDouble());
6120 // Round down to maximum value
6121 EXPECT_EQ(240, APFloat(APFloat::Float8E4M3FNUZ(), "247").convertToDouble());
6122 // Round up, causing overflow to NaN
6123 EXPECT_TRUE(APFloat(APFloat::Float8E4M3FNUZ(), "248").isNaN());
6124 // Overflow without rounding
6125 EXPECT_TRUE(APFloat(APFloat::Float8E4M3FNUZ(), "480").isNaN());
6126 // Inf converted to NaN
6127 EXPECT_TRUE(APFloat(APFloat::Float8E4M3FNUZ(), "inf").isNaN());
6128 // NaN converted to NaN
6129 EXPECT_TRUE(APFloat(APFloat::Float8E4M3FNUZ(), "nan").isNaN());
6130 // Negative zero converted to positive zero
6131 EXPECT_TRUE(APFloat(APFloat::Float8E4M3FNUZ(), "-0").isPosZero());
6134 TEST(APFloatTest
, Float8E4M3FNUZAdd
) {
6135 APFloat QNaN
= APFloat::getNaN(APFloat::Float8E4M3FNUZ(), false);
6137 auto FromStr
= [](StringRef S
) {
6138 return APFloat(APFloat::Float8E4M3FNUZ(), S
);
6147 APFloat::roundingMode roundingMode
= APFloat::rmNearestTiesToEven
;
6148 } AdditionTests
[] = {
6149 // Test addition operations involving NaN, overflow, and the max E4M3FNUZ
6150 // value (240) because E4M3FNUZ differs from IEEE-754 types in these
6152 {FromStr("240"), FromStr("4"), "240", APFloat::opInexact
,
6154 {FromStr("240"), FromStr("8"), "NaN",
6155 APFloat::opOverflow
| APFloat::opInexact
, APFloat::fcNaN
},
6156 {FromStr("240"), FromStr("16"), "NaN",
6157 APFloat::opOverflow
| APFloat::opInexact
, APFloat::fcNaN
},
6158 {FromStr("-240"), FromStr("-16"), "NaN",
6159 APFloat::opOverflow
| APFloat::opInexact
, APFloat::fcNaN
},
6160 {QNaN
, FromStr("-240"), "NaN", APFloat::opOK
, APFloat::fcNaN
},
6161 {FromStr("240"), FromStr("-16"), "224", APFloat::opOK
, APFloat::fcNormal
},
6162 {FromStr("240"), FromStr("0"), "240", APFloat::opOK
, APFloat::fcNormal
},
6163 {FromStr("240"), FromStr("32"), "240", APFloat::opInexact
,
6164 APFloat::fcNormal
, APFloat::rmTowardZero
},
6165 {FromStr("240"), FromStr("240"), "240", APFloat::opInexact
,
6166 APFloat::fcNormal
, APFloat::rmTowardZero
},
6169 for (size_t i
= 0; i
< std::size(AdditionTests
); ++i
) {
6170 APFloat
x(AdditionTests
[i
].x
);
6171 APFloat
y(AdditionTests
[i
].y
);
6172 APFloat::opStatus status
= x
.add(y
, AdditionTests
[i
].roundingMode
);
6174 APFloat
result(APFloat::Float8E4M3FNUZ(), AdditionTests
[i
].result
);
6176 EXPECT_TRUE(result
.bitwiseIsEqual(x
));
6177 EXPECT_EQ(AdditionTests
[i
].status
, (int)status
);
6178 EXPECT_EQ(AdditionTests
[i
].category
, (int)x
.getCategory());
6182 TEST(APFloatTest
, Float8E4M3FNUZDivideByZero
) {
6183 APFloat
x(APFloat::Float8E4M3FNUZ(), "1");
6184 APFloat
zero(APFloat::Float8E4M3FNUZ(), "0");
6185 EXPECT_EQ(x
.divide(zero
, APFloat::rmNearestTiesToEven
), APFloat::opDivByZero
);
6186 EXPECT_TRUE(x
.isNaN());
6189 TEST(APFloatTest
, ConvertE5M2FNUZToE4M3FNUZ
) {
6191 APFloat
test(APFloat::Float8E5M2FNUZ(), "1.0");
6192 APFloat::opStatus status
= test
.convert(
6193 APFloat::Float8E4M3FNUZ(), APFloat::rmNearestTiesToEven
, &losesInfo
);
6194 EXPECT_EQ(1.0f
, test
.convertToFloat());
6195 EXPECT_FALSE(losesInfo
);
6196 EXPECT_EQ(status
, APFloat::opOK
);
6199 test
= APFloat(APFloat::Float8E5M2FNUZ(), "0.0");
6200 status
= test
.convert(APFloat::Float8E4M3FNUZ(), APFloat::rmNearestTiesToEven
,
6202 EXPECT_EQ(0.0f
, test
.convertToFloat());
6203 EXPECT_FALSE(losesInfo
);
6204 EXPECT_EQ(status
, APFloat::opOK
);
6207 test
= APFloat(APFloat::Float8E5M2FNUZ(), "0x1.Cp7"); // 224
6208 status
= test
.convert(APFloat::Float8E4M3FNUZ(), APFloat::rmNearestTiesToEven
,
6210 EXPECT_EQ(0x1.Cp7
/* 224 */, test
.convertToFloat());
6211 EXPECT_FALSE(losesInfo
);
6212 EXPECT_EQ(status
, APFloat::opOK
);
6216 test
= APFloat(APFloat::Float8E5M2FNUZ(), "0x1.0p8"); // 256
6217 status
= test
.convert(APFloat::Float8E4M3FNUZ(), APFloat::rmNearestTiesToEven
,
6219 EXPECT_TRUE(std::isnan(test
.convertToFloat()));
6220 EXPECT_TRUE(losesInfo
);
6221 EXPECT_EQ(status
, APFloat::opOverflow
| APFloat::opInexact
);
6224 test
= APFloat(APFloat::Float8E5M2FNUZ(), "0x1.0p-11");
6225 status
= test
.convert(APFloat::Float8E4M3FNUZ(), APFloat::rmNearestTiesToEven
,
6227 EXPECT_EQ(0., test
.convertToFloat());
6228 EXPECT_TRUE(losesInfo
);
6229 EXPECT_EQ(status
, APFloat::opUnderflow
| APFloat::opInexact
);
6231 // Test rounding up to smallest denormal number
6233 test
= APFloat(APFloat::Float8E5M2FNUZ(), "0x1.8p-11");
6234 status
= test
.convert(APFloat::Float8E4M3FNUZ(), APFloat::rmNearestTiesToEven
,
6236 EXPECT_EQ(0x1.0p
-10, test
.convertToFloat());
6237 EXPECT_TRUE(losesInfo
);
6238 EXPECT_EQ(status
, APFloat::opUnderflow
| APFloat::opInexact
);
6240 // Testing inexact rounding to denormal number
6242 test
= APFloat(APFloat::Float8E5M2FNUZ(), "0x1.8p-10");
6243 status
= test
.convert(APFloat::Float8E4M3FNUZ(), APFloat::rmNearestTiesToEven
,
6245 EXPECT_EQ(0x1.0p
-9, test
.convertToFloat());
6246 EXPECT_TRUE(losesInfo
);
6247 EXPECT_EQ(status
, APFloat::opUnderflow
| APFloat::opInexact
);
6250 TEST(APFloatTest
, ConvertE4M3FNUZToE5M2FNUZ
) {
6252 APFloat
test(APFloat::Float8E4M3FNUZ(), "1.0");
6253 APFloat::opStatus status
= test
.convert(
6254 APFloat::Float8E5M2FNUZ(), APFloat::rmNearestTiesToEven
, &losesInfo
);
6255 EXPECT_EQ(1.0f
, test
.convertToFloat());
6256 EXPECT_FALSE(losesInfo
);
6257 EXPECT_EQ(status
, APFloat::opOK
);
6260 test
= APFloat(APFloat::Float8E4M3FNUZ(), "0.0");
6261 status
= test
.convert(APFloat::Float8E5M2FNUZ(), APFloat::rmNearestTiesToEven
,
6263 EXPECT_EQ(0.0f
, test
.convertToFloat());
6264 EXPECT_FALSE(losesInfo
);
6265 EXPECT_EQ(status
, APFloat::opOK
);
6268 test
= APFloat(APFloat::Float8E4M3FNUZ(), "0x1.2p0"); // 1.125
6269 status
= test
.convert(APFloat::Float8E5M2FNUZ(), APFloat::rmNearestTiesToEven
,
6271 EXPECT_EQ(0x1.0p0
/* 1.0 */, test
.convertToFloat());
6272 EXPECT_TRUE(losesInfo
);
6273 EXPECT_EQ(status
, APFloat::opInexact
);
6276 test
= APFloat(APFloat::Float8E4M3FNUZ(), "0x1.6p0"); // 1.375
6277 status
= test
.convert(APFloat::Float8E5M2FNUZ(), APFloat::rmNearestTiesToEven
,
6279 EXPECT_EQ(0x1.8p0
/* 1.5 */, test
.convertToFloat());
6280 EXPECT_TRUE(losesInfo
);
6281 EXPECT_EQ(status
, APFloat::opInexact
);
6283 // Convert E4M3FNUZ denormal to E5M2 normal. Should not be truncated, despite
6284 // the destination format having one fewer significand bit
6286 test
= APFloat(APFloat::Float8E4M3FNUZ(), "0x1.Cp-8");
6287 status
= test
.convert(APFloat::Float8E5M2FNUZ(), APFloat::rmNearestTiesToEven
,
6289 EXPECT_EQ(0x1.Cp
-8, test
.convertToFloat());
6290 EXPECT_FALSE(losesInfo
);
6291 EXPECT_EQ(status
, APFloat::opOK
);
6294 TEST(APFloatTest
, F8ToString
) {
6295 for (APFloat::Semantics S
:
6296 {APFloat::S_Float8E5M2
, APFloat::S_Float8E4M3FN
,
6297 APFloat::S_Float8E5M2FNUZ
, APFloat::S_Float8E4M3FNUZ
,
6298 APFloat::S_Float8E4M3B11FNUZ
}) {
6299 SCOPED_TRACE("Semantics=" + std::to_string(S
));
6300 for (int i
= 0; i
< 256; i
++) {
6301 SCOPED_TRACE("i=" + std::to_string(i
));
6302 APFloat
test(APFloat::EnumToSemantics(S
), APInt(8, i
));
6303 llvm::SmallString
<128> str
;
6307 EXPECT_EQ(str
, "NaN");
6309 APFloat
test2(APFloat::EnumToSemantics(S
), str
);
6310 EXPECT_TRUE(test
.bitwiseIsEqual(test2
));
6316 TEST(APFloatTest
, BitsToF8ToBits
) {
6317 for (APFloat::Semantics S
:
6318 {APFloat::S_Float8E5M2
, APFloat::S_Float8E4M3FN
,
6319 APFloat::S_Float8E5M2FNUZ
, APFloat::S_Float8E4M3FNUZ
,
6320 APFloat::S_Float8E4M3B11FNUZ
}) {
6321 SCOPED_TRACE("Semantics=" + std::to_string(S
));
6322 for (int i
= 0; i
< 256; i
++) {
6323 SCOPED_TRACE("i=" + std::to_string(i
));
6324 APInt bits_in
= APInt(8, i
);
6325 APFloat
test(APFloat::EnumToSemantics(S
), bits_in
);
6326 APInt bits_out
= test
.bitcastToAPInt();
6327 EXPECT_EQ(bits_in
, bits_out
);
6332 TEST(APFloatTest
, F8ToBitsToF8
) {
6333 for (APFloat::Semantics S
:
6334 {APFloat::S_Float8E5M2
, APFloat::S_Float8E4M3FN
,
6335 APFloat::S_Float8E5M2FNUZ
, APFloat::S_Float8E4M3FNUZ
,
6336 APFloat::S_Float8E4M3B11FNUZ
}) {
6337 SCOPED_TRACE("Semantics=" + std::to_string(S
));
6338 auto &Sem
= APFloat::EnumToSemantics(S
);
6339 for (bool negative
: {false, true}) {
6340 SCOPED_TRACE("negative=" + std::to_string(negative
));
6341 APFloat test
= APFloat::getZero(Sem
, /*Negative=*/negative
);
6342 for (int i
= 0; i
< 128; i
++, test
.next(/*nextDown=*/negative
)) {
6343 SCOPED_TRACE("i=" + std::to_string(i
));
6344 APInt bits
= test
.bitcastToAPInt();
6345 APFloat test2
= APFloat(Sem
, bits
);
6347 EXPECT_TRUE(test2
.isNaN());
6349 EXPECT_TRUE(test
.bitwiseIsEqual(test2
));
6356 TEST(APFloatTest
, IEEEdoubleToDouble
) {
6357 APFloat
DPosZero(0.0);
6358 APFloat
DPosZeroToDouble(DPosZero
.convertToDouble());
6359 EXPECT_TRUE(DPosZeroToDouble
.isPosZero());
6360 APFloat
DNegZero(-0.0);
6361 APFloat
DNegZeroToDouble(DNegZero
.convertToDouble());
6362 EXPECT_TRUE(DNegZeroToDouble
.isNegZero());
6365 EXPECT_EQ(1.0, DOne
.convertToDouble());
6366 APFloat DPosLargest
= APFloat::getLargest(APFloat::IEEEdouble(), false);
6367 EXPECT_EQ(std::numeric_limits
<double>::max(), DPosLargest
.convertToDouble());
6368 APFloat DNegLargest
= APFloat::getLargest(APFloat::IEEEdouble(), true);
6369 EXPECT_EQ(-std::numeric_limits
<double>::max(), DNegLargest
.convertToDouble());
6370 APFloat DPosSmallest
=
6371 APFloat::getSmallestNormalized(APFloat::IEEEdouble(), false);
6372 EXPECT_EQ(std::numeric_limits
<double>::min(), DPosSmallest
.convertToDouble());
6373 APFloat DNegSmallest
=
6374 APFloat::getSmallestNormalized(APFloat::IEEEdouble(), true);
6375 EXPECT_EQ(-std::numeric_limits
<double>::min(),
6376 DNegSmallest
.convertToDouble());
6378 APFloat DSmallestDenorm
= APFloat::getSmallest(APFloat::IEEEdouble(), false);
6379 EXPECT_EQ(std::numeric_limits
<double>::denorm_min(),
6380 DSmallestDenorm
.convertToDouble());
6381 APFloat
DLargestDenorm(APFloat::IEEEdouble(), "0x0.FFFFFFFFFFFFFp-1022");
6382 EXPECT_EQ(/*0x0.FFFFFFFFFFFFFp-1022*/ 2.225073858507201e-308,
6383 DLargestDenorm
.convertToDouble());
6385 APFloat DPosInf
= APFloat::getInf(APFloat::IEEEdouble());
6386 EXPECT_EQ(std::numeric_limits
<double>::infinity(), DPosInf
.convertToDouble());
6387 APFloat DNegInf
= APFloat::getInf(APFloat::IEEEdouble(), true);
6388 EXPECT_EQ(-std::numeric_limits
<double>::infinity(),
6389 DNegInf
.convertToDouble());
6390 APFloat DQNaN
= APFloat::getQNaN(APFloat::IEEEdouble());
6391 EXPECT_TRUE(std::isnan(DQNaN
.convertToDouble()));
6394 TEST(APFloatTest
, IEEEsingleToDouble
) {
6395 APFloat
FPosZero(0.0F
);
6396 APFloat
FPosZeroToDouble(FPosZero
.convertToDouble());
6397 EXPECT_TRUE(FPosZeroToDouble
.isPosZero());
6398 APFloat
FNegZero(-0.0F
);
6399 APFloat
FNegZeroToDouble(FNegZero
.convertToDouble());
6400 EXPECT_TRUE(FNegZeroToDouble
.isNegZero());
6403 EXPECT_EQ(1.0, FOne
.convertToDouble());
6404 APFloat FPosLargest
= APFloat::getLargest(APFloat::IEEEsingle(), false);
6405 EXPECT_EQ(std::numeric_limits
<float>::max(), FPosLargest
.convertToDouble());
6406 APFloat FNegLargest
= APFloat::getLargest(APFloat::IEEEsingle(), true);
6407 EXPECT_EQ(-std::numeric_limits
<float>::max(), FNegLargest
.convertToDouble());
6408 APFloat FPosSmallest
=
6409 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false);
6410 EXPECT_EQ(std::numeric_limits
<float>::min(), FPosSmallest
.convertToDouble());
6411 APFloat FNegSmallest
=
6412 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true);
6413 EXPECT_EQ(-std::numeric_limits
<float>::min(), FNegSmallest
.convertToDouble());
6415 APFloat FSmallestDenorm
= APFloat::getSmallest(APFloat::IEEEsingle(), false);
6416 EXPECT_EQ(std::numeric_limits
<float>::denorm_min(),
6417 FSmallestDenorm
.convertToDouble());
6418 APFloat
FLargestDenorm(APFloat::IEEEdouble(), "0x0.FFFFFEp-126");
6419 EXPECT_EQ(/*0x0.FFFFFEp-126*/ 1.1754942106924411e-38,
6420 FLargestDenorm
.convertToDouble());
6422 APFloat FPosInf
= APFloat::getInf(APFloat::IEEEsingle());
6423 EXPECT_EQ(std::numeric_limits
<double>::infinity(), FPosInf
.convertToDouble());
6424 APFloat FNegInf
= APFloat::getInf(APFloat::IEEEsingle(), true);
6425 EXPECT_EQ(-std::numeric_limits
<double>::infinity(),
6426 FNegInf
.convertToDouble());
6427 APFloat FQNaN
= APFloat::getQNaN(APFloat::IEEEsingle());
6428 EXPECT_TRUE(std::isnan(FQNaN
.convertToDouble()));
6431 TEST(APFloatTest
, IEEEhalfToDouble
) {
6432 APFloat HPosZero
= APFloat::getZero(APFloat::IEEEhalf());
6433 APFloat
HPosZeroToDouble(HPosZero
.convertToDouble());
6434 EXPECT_TRUE(HPosZeroToDouble
.isPosZero());
6435 APFloat HNegZero
= APFloat::getZero(APFloat::IEEEhalf(), true);
6436 APFloat
HNegZeroToDouble(HNegZero
.convertToDouble());
6437 EXPECT_TRUE(HNegZeroToDouble
.isNegZero());
6439 APFloat
HOne(APFloat::IEEEhalf(), "1.0");
6440 EXPECT_EQ(1.0, HOne
.convertToDouble());
6441 APFloat HPosLargest
= APFloat::getLargest(APFloat::IEEEhalf(), false);
6442 EXPECT_EQ(65504.0, HPosLargest
.convertToDouble());
6443 APFloat HNegLargest
= APFloat::getLargest(APFloat::IEEEhalf(), true);
6444 EXPECT_EQ(-65504.0, HNegLargest
.convertToDouble());
6445 APFloat HPosSmallest
=
6446 APFloat::getSmallestNormalized(APFloat::IEEEhalf(), false);
6447 EXPECT_EQ(/*0x1.p-14*/ 6.103515625e-05, HPosSmallest
.convertToDouble());
6448 APFloat HNegSmallest
=
6449 APFloat::getSmallestNormalized(APFloat::IEEEhalf(), true);
6450 EXPECT_EQ(/*-0x1.p-14*/ -6.103515625e-05, HNegSmallest
.convertToDouble());
6452 APFloat HSmallestDenorm
= APFloat::getSmallest(APFloat::IEEEhalf(), false);
6453 EXPECT_EQ(/*0x1.p-24*/ 5.960464477539063e-08,
6454 HSmallestDenorm
.convertToDouble());
6455 APFloat
HLargestDenorm(APFloat::IEEEhalf(), "0x1.FFCp-14");
6456 EXPECT_EQ(/*0x1.FFCp-14*/ 0.00012201070785522461,
6457 HLargestDenorm
.convertToDouble());
6459 APFloat HPosInf
= APFloat::getInf(APFloat::IEEEhalf());
6460 EXPECT_EQ(std::numeric_limits
<double>::infinity(), HPosInf
.convertToDouble());
6461 APFloat HNegInf
= APFloat::getInf(APFloat::IEEEhalf(), true);
6462 EXPECT_EQ(-std::numeric_limits
<double>::infinity(),
6463 HNegInf
.convertToDouble());
6464 APFloat HQNaN
= APFloat::getQNaN(APFloat::IEEEhalf());
6465 EXPECT_TRUE(std::isnan(HQNaN
.convertToDouble()));
6467 APFloat BPosZero
= APFloat::getZero(APFloat::IEEEhalf());
6468 APFloat
BPosZeroToDouble(BPosZero
.convertToDouble());
6469 EXPECT_TRUE(BPosZeroToDouble
.isPosZero());
6470 APFloat BNegZero
= APFloat::getZero(APFloat::IEEEhalf(), true);
6471 APFloat
BNegZeroToDouble(BNegZero
.convertToDouble());
6472 EXPECT_TRUE(BNegZeroToDouble
.isNegZero());
6475 TEST(APFloatTest
, BFloatToDouble
) {
6476 APFloat
BOne(APFloat::BFloat(), "1.0");
6477 EXPECT_EQ(1.0, BOne
.convertToDouble());
6478 APFloat BPosLargest
= APFloat::getLargest(APFloat::BFloat(), false);
6479 EXPECT_EQ(/*0x1.FEp127*/ 3.3895313892515355e+38,
6480 BPosLargest
.convertToDouble());
6481 APFloat BNegLargest
= APFloat::getLargest(APFloat::BFloat(), true);
6482 EXPECT_EQ(/*-0x1.FEp127*/ -3.3895313892515355e+38,
6483 BNegLargest
.convertToDouble());
6484 APFloat BPosSmallest
=
6485 APFloat::getSmallestNormalized(APFloat::BFloat(), false);
6486 EXPECT_EQ(/*0x1.p-126*/ 1.1754943508222875e-38,
6487 BPosSmallest
.convertToDouble());
6488 APFloat BNegSmallest
=
6489 APFloat::getSmallestNormalized(APFloat::BFloat(), true);
6490 EXPECT_EQ(/*-0x1.p-126*/ -1.1754943508222875e-38,
6491 BNegSmallest
.convertToDouble());
6493 APFloat BSmallestDenorm
= APFloat::getSmallest(APFloat::BFloat(), false);
6494 EXPECT_EQ(/*0x1.p-133*/ 9.183549615799121e-41,
6495 BSmallestDenorm
.convertToDouble());
6496 APFloat
BLargestDenorm(APFloat::BFloat(), "0x1.FCp-127");
6497 EXPECT_EQ(/*0x1.FCp-127*/ 1.1663108012064884e-38,
6498 BLargestDenorm
.convertToDouble());
6500 APFloat BPosInf
= APFloat::getInf(APFloat::BFloat());
6501 EXPECT_EQ(std::numeric_limits
<double>::infinity(), BPosInf
.convertToDouble());
6502 APFloat BNegInf
= APFloat::getInf(APFloat::BFloat(), true);
6503 EXPECT_EQ(-std::numeric_limits
<double>::infinity(),
6504 BNegInf
.convertToDouble());
6505 APFloat BQNaN
= APFloat::getQNaN(APFloat::BFloat());
6506 EXPECT_TRUE(std::isnan(BQNaN
.convertToDouble()));
6509 TEST(APFloatTest
, Float8E5M2ToDouble
) {
6510 APFloat
One(APFloat::Float8E5M2(), "1.0");
6511 EXPECT_EQ(1.0, One
.convertToDouble());
6512 APFloat
Two(APFloat::Float8E5M2(), "2.0");
6513 EXPECT_EQ(2.0, Two
.convertToDouble());
6514 APFloat PosLargest
= APFloat::getLargest(APFloat::Float8E5M2(), false);
6515 EXPECT_EQ(5.734400e+04, PosLargest
.convertToDouble());
6516 APFloat NegLargest
= APFloat::getLargest(APFloat::Float8E5M2(), true);
6517 EXPECT_EQ(-5.734400e+04, NegLargest
.convertToDouble());
6518 APFloat PosSmallest
=
6519 APFloat::getSmallestNormalized(APFloat::Float8E5M2(), false);
6520 EXPECT_EQ(0x1.p
-14, PosSmallest
.convertToDouble());
6521 APFloat NegSmallest
=
6522 APFloat::getSmallestNormalized(APFloat::Float8E5M2(), true);
6523 EXPECT_EQ(-0x1.p
-14, NegSmallest
.convertToDouble());
6525 APFloat SmallestDenorm
= APFloat::getSmallest(APFloat::Float8E5M2(), false);
6526 EXPECT_TRUE(SmallestDenorm
.isDenormal());
6527 EXPECT_EQ(0x1p
-16, SmallestDenorm
.convertToDouble());
6529 APFloat PosInf
= APFloat::getInf(APFloat::Float8E5M2());
6530 EXPECT_EQ(std::numeric_limits
<double>::infinity(), PosInf
.convertToDouble());
6531 APFloat NegInf
= APFloat::getInf(APFloat::Float8E5M2(), true);
6532 EXPECT_EQ(-std::numeric_limits
<double>::infinity(), NegInf
.convertToDouble());
6533 APFloat QNaN
= APFloat::getQNaN(APFloat::Float8E5M2());
6534 EXPECT_TRUE(std::isnan(QNaN
.convertToDouble()));
6537 TEST(APFloatTest
, Float8E4M3ToDouble
) {
6538 APFloat
One(APFloat::Float8E4M3(), "1.0");
6539 EXPECT_EQ(1.0, One
.convertToDouble());
6540 APFloat
Two(APFloat::Float8E4M3(), "2.0");
6541 EXPECT_EQ(2.0, Two
.convertToDouble());
6542 APFloat PosLargest
= APFloat::getLargest(APFloat::Float8E4M3(), false);
6543 EXPECT_EQ(240.0F
, PosLargest
.convertToDouble());
6544 APFloat NegLargest
= APFloat::getLargest(APFloat::Float8E4M3(), true);
6545 EXPECT_EQ(-240.0F
, NegLargest
.convertToDouble());
6546 APFloat PosSmallest
=
6547 APFloat::getSmallestNormalized(APFloat::Float8E4M3(), false);
6548 EXPECT_EQ(0x1.p
-6, PosSmallest
.convertToDouble());
6549 APFloat NegSmallest
=
6550 APFloat::getSmallestNormalized(APFloat::Float8E4M3(), true);
6551 EXPECT_EQ(-0x1.p
-6, NegSmallest
.convertToDouble());
6553 APFloat SmallestDenorm
= APFloat::getSmallest(APFloat::Float8E4M3(), false);
6554 EXPECT_TRUE(SmallestDenorm
.isDenormal());
6555 EXPECT_EQ(0x1.p
-9, SmallestDenorm
.convertToDouble());
6557 APFloat PosInf
= APFloat::getInf(APFloat::Float8E4M3());
6558 EXPECT_EQ(std::numeric_limits
<double>::infinity(), PosInf
.convertToDouble());
6559 APFloat NegInf
= APFloat::getInf(APFloat::Float8E4M3(), true);
6560 EXPECT_EQ(-std::numeric_limits
<double>::infinity(), NegInf
.convertToDouble());
6561 APFloat QNaN
= APFloat::getQNaN(APFloat::Float8E4M3());
6562 EXPECT_TRUE(std::isnan(QNaN
.convertToDouble()));
6565 TEST(APFloatTest
, Float8E4M3FNToDouble
) {
6566 APFloat
One(APFloat::Float8E4M3FN(), "1.0");
6567 EXPECT_EQ(1.0, One
.convertToDouble());
6568 APFloat
Two(APFloat::Float8E4M3FN(), "2.0");
6569 EXPECT_EQ(2.0, Two
.convertToDouble());
6570 APFloat PosLargest
= APFloat::getLargest(APFloat::Float8E4M3FN(), false);
6571 EXPECT_EQ(448., PosLargest
.convertToDouble());
6572 APFloat NegLargest
= APFloat::getLargest(APFloat::Float8E4M3FN(), true);
6573 EXPECT_EQ(-448., NegLargest
.convertToDouble());
6574 APFloat PosSmallest
=
6575 APFloat::getSmallestNormalized(APFloat::Float8E4M3FN(), false);
6576 EXPECT_EQ(0x1.p
-6, PosSmallest
.convertToDouble());
6577 APFloat NegSmallest
=
6578 APFloat::getSmallestNormalized(APFloat::Float8E4M3FN(), true);
6579 EXPECT_EQ(-0x1.p
-6, NegSmallest
.convertToDouble());
6581 APFloat SmallestDenorm
= APFloat::getSmallest(APFloat::Float8E4M3FN(), false);
6582 EXPECT_TRUE(SmallestDenorm
.isDenormal());
6583 EXPECT_EQ(0x1p
-9, SmallestDenorm
.convertToDouble());
6585 APFloat QNaN
= APFloat::getQNaN(APFloat::Float8E4M3FN());
6586 EXPECT_TRUE(std::isnan(QNaN
.convertToDouble()));
6589 TEST(APFloatTest
, Float8E5M2FNUZToDouble
) {
6590 APFloat
One(APFloat::Float8E5M2FNUZ(), "1.0");
6591 EXPECT_EQ(1.0, One
.convertToDouble());
6592 APFloat
Two(APFloat::Float8E5M2FNUZ(), "2.0");
6593 EXPECT_EQ(2.0, Two
.convertToDouble());
6594 APFloat PosLargest
= APFloat::getLargest(APFloat::Float8E5M2FNUZ(), false);
6595 EXPECT_EQ(57344., PosLargest
.convertToDouble());
6596 APFloat NegLargest
= APFloat::getLargest(APFloat::Float8E5M2FNUZ(), true);
6597 EXPECT_EQ(-57344., NegLargest
.convertToDouble());
6598 APFloat PosSmallest
=
6599 APFloat::getSmallestNormalized(APFloat::Float8E5M2FNUZ(), false);
6600 EXPECT_EQ(0x1.p
-15, PosSmallest
.convertToDouble());
6601 APFloat NegSmallest
=
6602 APFloat::getSmallestNormalized(APFloat::Float8E5M2FNUZ(), true);
6603 EXPECT_EQ(-0x1.p
-15, NegSmallest
.convertToDouble());
6605 APFloat SmallestDenorm
=
6606 APFloat::getSmallest(APFloat::Float8E5M2FNUZ(), false);
6607 EXPECT_TRUE(SmallestDenorm
.isDenormal());
6608 EXPECT_EQ(0x1p
-17, SmallestDenorm
.convertToDouble());
6610 APFloat QNaN
= APFloat::getQNaN(APFloat::Float8E5M2FNUZ());
6611 EXPECT_TRUE(std::isnan(QNaN
.convertToDouble()));
6614 TEST(APFloatTest
, Float8E4M3FNUZToDouble
) {
6615 APFloat
One(APFloat::Float8E4M3FNUZ(), "1.0");
6616 EXPECT_EQ(1.0, One
.convertToDouble());
6617 APFloat
Two(APFloat::Float8E4M3FNUZ(), "2.0");
6618 EXPECT_EQ(2.0, Two
.convertToDouble());
6619 APFloat PosLargest
= APFloat::getLargest(APFloat::Float8E4M3FNUZ(), false);
6620 EXPECT_EQ(240., PosLargest
.convertToDouble());
6621 APFloat NegLargest
= APFloat::getLargest(APFloat::Float8E4M3FNUZ(), true);
6622 EXPECT_EQ(-240., NegLargest
.convertToDouble());
6623 APFloat PosSmallest
=
6624 APFloat::getSmallestNormalized(APFloat::Float8E4M3FNUZ(), false);
6625 EXPECT_EQ(0x1.p
-7, PosSmallest
.convertToDouble());
6626 APFloat NegSmallest
=
6627 APFloat::getSmallestNormalized(APFloat::Float8E4M3FNUZ(), true);
6628 EXPECT_EQ(-0x1.p
-7, NegSmallest
.convertToDouble());
6630 APFloat SmallestDenorm
=
6631 APFloat::getSmallest(APFloat::Float8E4M3FNUZ(), false);
6632 EXPECT_TRUE(SmallestDenorm
.isDenormal());
6633 EXPECT_EQ(0x1p
-10, SmallestDenorm
.convertToDouble());
6635 APFloat QNaN
= APFloat::getQNaN(APFloat::Float8E4M3FNUZ());
6636 EXPECT_TRUE(std::isnan(QNaN
.convertToDouble()));
6639 TEST(APFloatTest
, FloatTF32ToDouble
) {
6640 APFloat
One(APFloat::FloatTF32(), "1.0");
6641 EXPECT_EQ(1.0, One
.convertToDouble());
6642 APFloat PosLargest
= APFloat::getLargest(APFloat::FloatTF32(), false);
6643 EXPECT_EQ(3.401162134214653489792616e+38, PosLargest
.convertToDouble());
6644 APFloat NegLargest
= APFloat::getLargest(APFloat::FloatTF32(), true);
6645 EXPECT_EQ(-3.401162134214653489792616e+38, NegLargest
.convertToDouble());
6646 APFloat PosSmallest
=
6647 APFloat::getSmallestNormalized(APFloat::FloatTF32(), false);
6648 EXPECT_EQ(1.1754943508222875079687e-38, PosSmallest
.convertToDouble());
6649 APFloat NegSmallest
=
6650 APFloat::getSmallestNormalized(APFloat::FloatTF32(), true);
6651 EXPECT_EQ(-1.1754943508222875079687e-38, NegSmallest
.convertToDouble());
6653 APFloat SmallestDenorm
= APFloat::getSmallest(APFloat::FloatTF32(), false);
6654 EXPECT_EQ(1.1479437019748901445007e-41, SmallestDenorm
.convertToDouble());
6655 APFloat
LargestDenorm(APFloat::FloatTF32(), "0x1.FF8p-127");
6656 EXPECT_EQ(/*0x1.FF8p-127*/ 1.1743464071203126178242e-38,
6657 LargestDenorm
.convertToDouble());
6659 APFloat PosInf
= APFloat::getInf(APFloat::FloatTF32());
6660 EXPECT_EQ(std::numeric_limits
<double>::infinity(), PosInf
.convertToDouble());
6661 APFloat NegInf
= APFloat::getInf(APFloat::FloatTF32(), true);
6662 EXPECT_EQ(-std::numeric_limits
<double>::infinity(), NegInf
.convertToDouble());
6663 APFloat QNaN
= APFloat::getQNaN(APFloat::FloatTF32());
6664 EXPECT_TRUE(std::isnan(QNaN
.convertToDouble()));
6667 TEST(APFloatTest
, Float8E5M2FNUZToFloat
) {
6668 APFloat PosZero
= APFloat::getZero(APFloat::Float8E5M2FNUZ());
6669 APFloat
PosZeroToFloat(PosZero
.convertToFloat());
6670 EXPECT_TRUE(PosZeroToFloat
.isPosZero());
6671 // Negative zero is not supported
6672 APFloat NegZero
= APFloat::getZero(APFloat::Float8E5M2FNUZ(), true);
6673 APFloat
NegZeroToFloat(NegZero
.convertToFloat());
6674 EXPECT_TRUE(NegZeroToFloat
.isPosZero());
6675 APFloat
One(APFloat::Float8E5M2FNUZ(), "1.0");
6676 EXPECT_EQ(1.0F
, One
.convertToFloat());
6677 APFloat
Two(APFloat::Float8E5M2FNUZ(), "2.0");
6678 EXPECT_EQ(2.0F
, Two
.convertToFloat());
6679 APFloat PosLargest
= APFloat::getLargest(APFloat::Float8E5M2FNUZ(), false);
6680 EXPECT_EQ(57344.F
, PosLargest
.convertToFloat());
6681 APFloat NegLargest
= APFloat::getLargest(APFloat::Float8E5M2FNUZ(), true);
6682 EXPECT_EQ(-57344.F
, NegLargest
.convertToFloat());
6683 APFloat PosSmallest
=
6684 APFloat::getSmallestNormalized(APFloat::Float8E5M2FNUZ(), false);
6685 EXPECT_EQ(0x1.p
-15F
, PosSmallest
.convertToFloat());
6686 APFloat NegSmallest
=
6687 APFloat::getSmallestNormalized(APFloat::Float8E5M2FNUZ(), true);
6688 EXPECT_EQ(-0x1.p
-15F
, NegSmallest
.convertToFloat());
6690 APFloat SmallestDenorm
=
6691 APFloat::getSmallest(APFloat::Float8E5M2FNUZ(), false);
6692 EXPECT_TRUE(SmallestDenorm
.isDenormal());
6693 EXPECT_EQ(0x1p
-17F
, SmallestDenorm
.convertToFloat());
6695 APFloat QNaN
= APFloat::getQNaN(APFloat::Float8E5M2FNUZ());
6696 EXPECT_TRUE(std::isnan(QNaN
.convertToFloat()));
6699 TEST(APFloatTest
, Float8E4M3FNUZToFloat
) {
6700 APFloat PosZero
= APFloat::getZero(APFloat::Float8E4M3FNUZ());
6701 APFloat
PosZeroToFloat(PosZero
.convertToFloat());
6702 EXPECT_TRUE(PosZeroToFloat
.isPosZero());
6703 // Negative zero is not supported
6704 APFloat NegZero
= APFloat::getZero(APFloat::Float8E4M3FNUZ(), true);
6705 APFloat
NegZeroToFloat(NegZero
.convertToFloat());
6706 EXPECT_TRUE(NegZeroToFloat
.isPosZero());
6707 APFloat
One(APFloat::Float8E4M3FNUZ(), "1.0");
6708 EXPECT_EQ(1.0F
, One
.convertToFloat());
6709 APFloat
Two(APFloat::Float8E4M3FNUZ(), "2.0");
6710 EXPECT_EQ(2.0F
, Two
.convertToFloat());
6711 APFloat PosLargest
= APFloat::getLargest(APFloat::Float8E4M3FNUZ(), false);
6712 EXPECT_EQ(240.F
, PosLargest
.convertToFloat());
6713 APFloat NegLargest
= APFloat::getLargest(APFloat::Float8E4M3FNUZ(), true);
6714 EXPECT_EQ(-240.F
, NegLargest
.convertToFloat());
6715 APFloat PosSmallest
=
6716 APFloat::getSmallestNormalized(APFloat::Float8E4M3FNUZ(), false);
6717 EXPECT_EQ(0x1.p
-7F
, PosSmallest
.convertToFloat());
6718 APFloat NegSmallest
=
6719 APFloat::getSmallestNormalized(APFloat::Float8E4M3FNUZ(), true);
6720 EXPECT_EQ(-0x1.p
-7F
, NegSmallest
.convertToFloat());
6722 APFloat SmallestDenorm
=
6723 APFloat::getSmallest(APFloat::Float8E4M3FNUZ(), false);
6724 EXPECT_TRUE(SmallestDenorm
.isDenormal());
6725 EXPECT_EQ(0x1p
-10F
, SmallestDenorm
.convertToFloat());
6727 APFloat QNaN
= APFloat::getQNaN(APFloat::Float8E4M3FNUZ());
6728 EXPECT_TRUE(std::isnan(QNaN
.convertToFloat()));
6731 TEST(APFloatTest
, IEEEsingleToFloat
) {
6732 APFloat
FPosZero(0.0F
);
6733 APFloat
FPosZeroToFloat(FPosZero
.convertToFloat());
6734 EXPECT_TRUE(FPosZeroToFloat
.isPosZero());
6735 APFloat
FNegZero(-0.0F
);
6736 APFloat
FNegZeroToFloat(FNegZero
.convertToFloat());
6737 EXPECT_TRUE(FNegZeroToFloat
.isNegZero());
6740 EXPECT_EQ(1.0F
, FOne
.convertToFloat());
6741 APFloat FPosLargest
= APFloat::getLargest(APFloat::IEEEsingle(), false);
6742 EXPECT_EQ(std::numeric_limits
<float>::max(), FPosLargest
.convertToFloat());
6743 APFloat FNegLargest
= APFloat::getLargest(APFloat::IEEEsingle(), true);
6744 EXPECT_EQ(-std::numeric_limits
<float>::max(), FNegLargest
.convertToFloat());
6745 APFloat FPosSmallest
=
6746 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false);
6747 EXPECT_EQ(std::numeric_limits
<float>::min(), FPosSmallest
.convertToFloat());
6748 APFloat FNegSmallest
=
6749 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true);
6750 EXPECT_EQ(-std::numeric_limits
<float>::min(), FNegSmallest
.convertToFloat());
6752 APFloat FSmallestDenorm
= APFloat::getSmallest(APFloat::IEEEsingle(), false);
6753 EXPECT_EQ(std::numeric_limits
<float>::denorm_min(),
6754 FSmallestDenorm
.convertToFloat());
6755 APFloat
FLargestDenorm(APFloat::IEEEsingle(), "0x1.FFFFFEp-126");
6756 EXPECT_EQ(/*0x1.FFFFFEp-126*/ 2.3509885615147286e-38F
,
6757 FLargestDenorm
.convertToFloat());
6759 APFloat FPosInf
= APFloat::getInf(APFloat::IEEEsingle());
6760 EXPECT_EQ(std::numeric_limits
<float>::infinity(), FPosInf
.convertToFloat());
6761 APFloat FNegInf
= APFloat::getInf(APFloat::IEEEsingle(), true);
6762 EXPECT_EQ(-std::numeric_limits
<float>::infinity(), FNegInf
.convertToFloat());
6763 APFloat FQNaN
= APFloat::getQNaN(APFloat::IEEEsingle());
6764 EXPECT_TRUE(std::isnan(FQNaN
.convertToFloat()));
6767 TEST(APFloatTest
, IEEEhalfToFloat
) {
6768 APFloat HPosZero
= APFloat::getZero(APFloat::IEEEhalf());
6769 APFloat
HPosZeroToFloat(HPosZero
.convertToFloat());
6770 EXPECT_TRUE(HPosZeroToFloat
.isPosZero());
6771 APFloat HNegZero
= APFloat::getZero(APFloat::IEEEhalf(), true);
6772 APFloat
HNegZeroToFloat(HNegZero
.convertToFloat());
6773 EXPECT_TRUE(HNegZeroToFloat
.isNegZero());
6775 APFloat
HOne(APFloat::IEEEhalf(), "1.0");
6776 EXPECT_EQ(1.0F
, HOne
.convertToFloat());
6777 APFloat HPosLargest
= APFloat::getLargest(APFloat::IEEEhalf(), false);
6778 EXPECT_EQ(/*0x1.FFCp15*/ 65504.0F
, HPosLargest
.convertToFloat());
6779 APFloat HNegLargest
= APFloat::getLargest(APFloat::IEEEhalf(), true);
6780 EXPECT_EQ(/*-0x1.FFCp15*/ -65504.0F
, HNegLargest
.convertToFloat());
6781 APFloat HPosSmallest
=
6782 APFloat::getSmallestNormalized(APFloat::IEEEhalf(), false);
6783 EXPECT_EQ(/*0x1.p-14*/ 6.103515625e-05F
, HPosSmallest
.convertToFloat());
6784 APFloat HNegSmallest
=
6785 APFloat::getSmallestNormalized(APFloat::IEEEhalf(), true);
6786 EXPECT_EQ(/*-0x1.p-14*/ -6.103515625e-05F
, HNegSmallest
.convertToFloat());
6788 APFloat HSmallestDenorm
= APFloat::getSmallest(APFloat::IEEEhalf(), false);
6789 EXPECT_EQ(/*0x1.p-24*/ 5.960464477539063e-08F
,
6790 HSmallestDenorm
.convertToFloat());
6791 APFloat
HLargestDenorm(APFloat::IEEEhalf(), "0x1.FFCp-14");
6792 EXPECT_EQ(/*0x1.FFCp-14*/ 0.00012201070785522461F
,
6793 HLargestDenorm
.convertToFloat());
6795 APFloat HPosInf
= APFloat::getInf(APFloat::IEEEhalf());
6796 EXPECT_EQ(std::numeric_limits
<float>::infinity(), HPosInf
.convertToFloat());
6797 APFloat HNegInf
= APFloat::getInf(APFloat::IEEEhalf(), true);
6798 EXPECT_EQ(-std::numeric_limits
<float>::infinity(), HNegInf
.convertToFloat());
6799 APFloat HQNaN
= APFloat::getQNaN(APFloat::IEEEhalf());
6800 EXPECT_TRUE(std::isnan(HQNaN
.convertToFloat()));
6803 TEST(APFloatTest
, BFloatToFloat
) {
6804 APFloat BPosZero
= APFloat::getZero(APFloat::BFloat());
6805 APFloat
BPosZeroToDouble(BPosZero
.convertToFloat());
6806 EXPECT_TRUE(BPosZeroToDouble
.isPosZero());
6807 APFloat BNegZero
= APFloat::getZero(APFloat::BFloat(), true);
6808 APFloat
BNegZeroToDouble(BNegZero
.convertToFloat());
6809 EXPECT_TRUE(BNegZeroToDouble
.isNegZero());
6811 APFloat
BOne(APFloat::BFloat(), "1.0");
6812 EXPECT_EQ(1.0F
, BOne
.convertToFloat());
6813 APFloat BPosLargest
= APFloat::getLargest(APFloat::BFloat(), false);
6814 EXPECT_EQ(/*0x1.FEp127*/ 3.3895313892515355e+38F
,
6815 BPosLargest
.convertToFloat());
6816 APFloat BNegLargest
= APFloat::getLargest(APFloat::BFloat(), true);
6817 EXPECT_EQ(/*-0x1.FEp127*/ -3.3895313892515355e+38F
,
6818 BNegLargest
.convertToFloat());
6819 APFloat BPosSmallest
=
6820 APFloat::getSmallestNormalized(APFloat::BFloat(), false);
6821 EXPECT_EQ(/*0x1.p-126*/ 1.1754943508222875e-38F
,
6822 BPosSmallest
.convertToFloat());
6823 APFloat BNegSmallest
=
6824 APFloat::getSmallestNormalized(APFloat::BFloat(), true);
6825 EXPECT_EQ(/*-0x1.p-126*/ -1.1754943508222875e-38F
,
6826 BNegSmallest
.convertToFloat());
6828 APFloat BSmallestDenorm
= APFloat::getSmallest(APFloat::BFloat(), false);
6829 EXPECT_EQ(/*0x1.p-133*/ 9.183549615799121e-41F
,
6830 BSmallestDenorm
.convertToFloat());
6831 APFloat
BLargestDenorm(APFloat::BFloat(), "0x1.FCp-127");
6832 EXPECT_EQ(/*0x1.FCp-127*/ 1.1663108012064884e-38F
,
6833 BLargestDenorm
.convertToFloat());
6835 APFloat BPosInf
= APFloat::getInf(APFloat::BFloat());
6836 EXPECT_EQ(std::numeric_limits
<float>::infinity(), BPosInf
.convertToFloat());
6837 APFloat BNegInf
= APFloat::getInf(APFloat::BFloat(), true);
6838 EXPECT_EQ(-std::numeric_limits
<float>::infinity(), BNegInf
.convertToFloat());
6839 APFloat BQNaN
= APFloat::getQNaN(APFloat::BFloat());
6840 EXPECT_TRUE(std::isnan(BQNaN
.convertToFloat()));
6843 TEST(APFloatTest
, Float8E5M2ToFloat
) {
6844 APFloat PosZero
= APFloat::getZero(APFloat::Float8E5M2());
6845 APFloat
PosZeroToFloat(PosZero
.convertToFloat());
6846 EXPECT_TRUE(PosZeroToFloat
.isPosZero());
6847 APFloat NegZero
= APFloat::getZero(APFloat::Float8E5M2(), true);
6848 APFloat
NegZeroToFloat(NegZero
.convertToFloat());
6849 EXPECT_TRUE(NegZeroToFloat
.isNegZero());
6851 APFloat
One(APFloat::Float8E5M2(), "1.0");
6852 EXPECT_EQ(1.0F
, One
.convertToFloat());
6853 APFloat
Two(APFloat::Float8E5M2(), "2.0");
6854 EXPECT_EQ(2.0F
, Two
.convertToFloat());
6856 APFloat PosLargest
= APFloat::getLargest(APFloat::Float8E5M2(), false);
6857 EXPECT_EQ(5.734400e+04, PosLargest
.convertToFloat());
6858 APFloat NegLargest
= APFloat::getLargest(APFloat::Float8E5M2(), true);
6859 EXPECT_EQ(-5.734400e+04, NegLargest
.convertToFloat());
6860 APFloat PosSmallest
=
6861 APFloat::getSmallestNormalized(APFloat::Float8E5M2(), false);
6862 EXPECT_EQ(0x1.p
-14, PosSmallest
.convertToFloat());
6863 APFloat NegSmallest
=
6864 APFloat::getSmallestNormalized(APFloat::Float8E5M2(), true);
6865 EXPECT_EQ(-0x1.p
-14, NegSmallest
.convertToFloat());
6867 APFloat SmallestDenorm
= APFloat::getSmallest(APFloat::Float8E5M2(), false);
6868 EXPECT_TRUE(SmallestDenorm
.isDenormal());
6869 EXPECT_EQ(0x1.p
-16, SmallestDenorm
.convertToFloat());
6871 APFloat PosInf
= APFloat::getInf(APFloat::Float8E5M2());
6872 EXPECT_EQ(std::numeric_limits
<float>::infinity(), PosInf
.convertToFloat());
6873 APFloat NegInf
= APFloat::getInf(APFloat::Float8E5M2(), true);
6874 EXPECT_EQ(-std::numeric_limits
<float>::infinity(), NegInf
.convertToFloat());
6875 APFloat QNaN
= APFloat::getQNaN(APFloat::Float8E5M2());
6876 EXPECT_TRUE(std::isnan(QNaN
.convertToFloat()));
6879 TEST(APFloatTest
, Float8E4M3ToFloat
) {
6880 APFloat PosZero
= APFloat::getZero(APFloat::Float8E4M3());
6881 APFloat
PosZeroToFloat(PosZero
.convertToFloat());
6882 EXPECT_TRUE(PosZeroToFloat
.isPosZero());
6883 APFloat NegZero
= APFloat::getZero(APFloat::Float8E4M3(), true);
6884 APFloat
NegZeroToFloat(NegZero
.convertToFloat());
6885 EXPECT_TRUE(NegZeroToFloat
.isNegZero());
6887 APFloat
One(APFloat::Float8E4M3(), "1.0");
6888 EXPECT_EQ(1.0F
, One
.convertToFloat());
6889 APFloat
Two(APFloat::Float8E4M3(), "2.0");
6890 EXPECT_EQ(2.0F
, Two
.convertToFloat());
6892 APFloat PosLargest
= APFloat::getLargest(APFloat::Float8E4M3(), false);
6893 EXPECT_EQ(240.0F
, PosLargest
.convertToFloat());
6894 APFloat NegLargest
= APFloat::getLargest(APFloat::Float8E4M3(), true);
6895 EXPECT_EQ(-240.0F
, NegLargest
.convertToFloat());
6896 APFloat PosSmallest
=
6897 APFloat::getSmallestNormalized(APFloat::Float8E4M3(), false);
6898 EXPECT_EQ(0x1.p
-6, PosSmallest
.convertToFloat());
6899 APFloat NegSmallest
=
6900 APFloat::getSmallestNormalized(APFloat::Float8E4M3(), true);
6901 EXPECT_EQ(-0x1.p
-6, NegSmallest
.convertToFloat());
6903 APFloat SmallestDenorm
= APFloat::getSmallest(APFloat::Float8E4M3(), false);
6904 EXPECT_TRUE(SmallestDenorm
.isDenormal());
6905 EXPECT_EQ(0x1.p
-9, SmallestDenorm
.convertToFloat());
6907 APFloat PosInf
= APFloat::getInf(APFloat::Float8E4M3());
6908 EXPECT_EQ(std::numeric_limits
<float>::infinity(), PosInf
.convertToFloat());
6909 APFloat NegInf
= APFloat::getInf(APFloat::Float8E4M3(), true);
6910 EXPECT_EQ(-std::numeric_limits
<float>::infinity(), NegInf
.convertToFloat());
6911 APFloat QNaN
= APFloat::getQNaN(APFloat::Float8E4M3());
6912 EXPECT_TRUE(std::isnan(QNaN
.convertToFloat()));
6915 TEST(APFloatTest
, Float8E4M3FNToFloat
) {
6916 APFloat PosZero
= APFloat::getZero(APFloat::Float8E4M3FN());
6917 APFloat
PosZeroToFloat(PosZero
.convertToFloat());
6918 EXPECT_TRUE(PosZeroToFloat
.isPosZero());
6919 APFloat NegZero
= APFloat::getZero(APFloat::Float8E4M3FN(), true);
6920 APFloat
NegZeroToFloat(NegZero
.convertToFloat());
6921 EXPECT_TRUE(NegZeroToFloat
.isNegZero());
6923 APFloat
One(APFloat::Float8E4M3FN(), "1.0");
6924 EXPECT_EQ(1.0F
, One
.convertToFloat());
6925 APFloat
Two(APFloat::Float8E4M3FN(), "2.0");
6926 EXPECT_EQ(2.0F
, Two
.convertToFloat());
6928 APFloat PosLargest
= APFloat::getLargest(APFloat::Float8E4M3FN(), false);
6929 EXPECT_EQ(448., PosLargest
.convertToFloat());
6930 APFloat NegLargest
= APFloat::getLargest(APFloat::Float8E4M3FN(), true);
6931 EXPECT_EQ(-448, NegLargest
.convertToFloat());
6932 APFloat PosSmallest
=
6933 APFloat::getSmallestNormalized(APFloat::Float8E4M3FN(), false);
6934 EXPECT_EQ(0x1.p
-6, PosSmallest
.convertToFloat());
6935 APFloat NegSmallest
=
6936 APFloat::getSmallestNormalized(APFloat::Float8E4M3FN(), true);
6937 EXPECT_EQ(-0x1.p
-6, NegSmallest
.convertToFloat());
6939 APFloat SmallestDenorm
= APFloat::getSmallest(APFloat::Float8E4M3FN(), false);
6940 EXPECT_TRUE(SmallestDenorm
.isDenormal());
6941 EXPECT_EQ(0x1.p
-9, SmallestDenorm
.convertToFloat());
6943 APFloat QNaN
= APFloat::getQNaN(APFloat::Float8E4M3FN());
6944 EXPECT_TRUE(std::isnan(QNaN
.convertToFloat()));
6947 TEST(APFloatTest
, FloatTF32ToFloat
) {
6948 APFloat PosZero
= APFloat::getZero(APFloat::FloatTF32());
6949 APFloat
PosZeroToFloat(PosZero
.convertToFloat());
6950 EXPECT_TRUE(PosZeroToFloat
.isPosZero());
6951 APFloat NegZero
= APFloat::getZero(APFloat::FloatTF32(), true);
6952 APFloat
NegZeroToFloat(NegZero
.convertToFloat());
6953 EXPECT_TRUE(NegZeroToFloat
.isNegZero());
6955 APFloat
One(APFloat::FloatTF32(), "1.0");
6956 EXPECT_EQ(1.0F
, One
.convertToFloat());
6957 APFloat
Two(APFloat::FloatTF32(), "2.0");
6958 EXPECT_EQ(2.0F
, Two
.convertToFloat());
6960 APFloat PosLargest
= APFloat::getLargest(APFloat::FloatTF32(), false);
6961 EXPECT_EQ(3.40116213421e+38F
, PosLargest
.convertToFloat());
6963 APFloat NegLargest
= APFloat::getLargest(APFloat::FloatTF32(), true);
6964 EXPECT_EQ(-3.40116213421e+38F
, NegLargest
.convertToFloat());
6966 APFloat PosSmallest
=
6967 APFloat::getSmallestNormalized(APFloat::FloatTF32(), false);
6968 EXPECT_EQ(/*0x1.p-126*/ 1.1754943508222875e-38F
,
6969 PosSmallest
.convertToFloat());
6970 APFloat NegSmallest
=
6971 APFloat::getSmallestNormalized(APFloat::FloatTF32(), true);
6972 EXPECT_EQ(/*-0x1.p-126*/ -1.1754943508222875e-38F
,
6973 NegSmallest
.convertToFloat());
6975 APFloat SmallestDenorm
= APFloat::getSmallest(APFloat::FloatTF32(), false);
6976 EXPECT_TRUE(SmallestDenorm
.isDenormal());
6977 EXPECT_EQ(0x0.004p
-126, SmallestDenorm
.convertToFloat());
6979 APFloat QNaN
= APFloat::getQNaN(APFloat::FloatTF32());
6980 EXPECT_TRUE(std::isnan(QNaN
.convertToFloat()));
6983 TEST(APFloatTest
, getExactLog2
) {
6984 for (unsigned I
= 0; I
!= APFloat::S_MaxSemantics
+ 1; ++I
) {
6985 auto SemEnum
= static_cast<APFloat::Semantics
>(I
);
6986 const fltSemantics
&Semantics
= APFloat::EnumToSemantics(SemEnum
);
6988 APFloat
One(Semantics
, "1.0");
6990 if (I
== APFloat::S_PPCDoubleDouble
) {
6992 EXPECT_EQ(INT_MIN
, One
.getExactLog2());
6993 EXPECT_EQ(INT_MIN
, One
.getExactLog2Abs());
6997 int MinExp
= APFloat::semanticsMinExponent(Semantics
);
6998 int MaxExp
= APFloat::semanticsMaxExponent(Semantics
);
6999 int Precision
= APFloat::semanticsPrecision(Semantics
);
7001 EXPECT_EQ(0, One
.getExactLog2());
7002 EXPECT_EQ(INT_MIN
, APFloat(Semantics
, "3.0").getExactLog2());
7003 EXPECT_EQ(INT_MIN
, APFloat(Semantics
, "-3.0").getExactLog2());
7004 EXPECT_EQ(INT_MIN
, APFloat(Semantics
, "3.0").getExactLog2Abs());
7005 EXPECT_EQ(INT_MIN
, APFloat(Semantics
, "-3.0").getExactLog2Abs());
7007 if (I
== APFloat::S_Float6E2M3FN
|| I
== APFloat::S_Float4E2M1FN
) {
7008 EXPECT_EQ(2, APFloat(Semantics
, "4.0").getExactLog2());
7009 EXPECT_EQ(INT_MIN
, APFloat(Semantics
, "-4.0").getExactLog2());
7010 EXPECT_EQ(2, APFloat(Semantics
, "4.0").getExactLog2Abs());
7011 EXPECT_EQ(2, APFloat(Semantics
, "-4.0").getExactLog2Abs());
7013 EXPECT_EQ(3, APFloat(Semantics
, "8.0").getExactLog2());
7014 EXPECT_EQ(INT_MIN
, APFloat(Semantics
, "-8.0").getExactLog2());
7015 EXPECT_EQ(-2, APFloat(Semantics
, "0.25").getExactLog2());
7016 EXPECT_EQ(-2, APFloat(Semantics
, "0.25").getExactLog2Abs());
7017 EXPECT_EQ(INT_MIN
, APFloat(Semantics
, "-0.25").getExactLog2());
7018 EXPECT_EQ(-2, APFloat(Semantics
, "-0.25").getExactLog2Abs());
7019 EXPECT_EQ(3, APFloat(Semantics
, "8.0").getExactLog2Abs());
7020 EXPECT_EQ(3, APFloat(Semantics
, "-8.0").getExactLog2Abs());
7023 EXPECT_EQ(INT_MIN
, APFloat::getZero(Semantics
, false).getExactLog2());
7024 EXPECT_EQ(INT_MIN
, APFloat::getZero(Semantics
, true).getExactLog2());
7025 EXPECT_EQ(INT_MIN
, APFloat::getZero(Semantics
, false).getExactLog2Abs());
7026 EXPECT_EQ(INT_MIN
, APFloat::getZero(Semantics
, true).getExactLog2Abs());
7028 if (APFloat::hasNanOrInf(Semantics
)) {
7029 EXPECT_EQ(INT_MIN
, APFloat::getInf(Semantics
).getExactLog2());
7030 EXPECT_EQ(INT_MIN
, APFloat::getInf(Semantics
, true).getExactLog2());
7031 EXPECT_EQ(INT_MIN
, APFloat::getNaN(Semantics
, false).getExactLog2());
7032 EXPECT_EQ(INT_MIN
, APFloat::getNaN(Semantics
, true).getExactLog2());
7034 EXPECT_EQ(INT_MIN
, APFloat::getInf(Semantics
).getExactLog2Abs());
7035 EXPECT_EQ(INT_MIN
, APFloat::getInf(Semantics
, true).getExactLog2Abs());
7036 EXPECT_EQ(INT_MIN
, APFloat::getNaN(Semantics
, false).getExactLog2Abs());
7037 EXPECT_EQ(INT_MIN
, APFloat::getNaN(Semantics
, true).getExactLog2Abs());
7041 scalbn(One
, MinExp
- Precision
- 1, APFloat::rmNearestTiesToEven
)
7044 scalbn(One
, MinExp
- Precision
, APFloat::rmNearestTiesToEven
)
7049 scalbn(One
, MaxExp
+ 1, APFloat::rmNearestTiesToEven
).getExactLog2());
7051 for (int i
= MinExp
- Precision
+ 1; i
<= MaxExp
; ++i
) {
7052 EXPECT_EQ(i
, scalbn(One
, i
, APFloat::rmNearestTiesToEven
).getExactLog2());
7057 TEST(APFloatTest
, Float6E3M2FNFromString
) {
7058 // Exactly representable
7059 EXPECT_EQ(28, APFloat(APFloat::Float6E3M2FN(), "28").convertToDouble());
7060 // Round down to maximum value
7061 EXPECT_EQ(28, APFloat(APFloat::Float6E3M2FN(), "32").convertToDouble());
7063 #ifdef GTEST_HAS_DEATH_TEST
7065 EXPECT_DEATH(APFloat(APFloat::Float6E3M2FN(), "inf"),
7066 "This floating point format does not support Inf");
7067 EXPECT_DEATH(APFloat(APFloat::Float6E3M2FN(), "nan"),
7068 "This floating point format does not support NaN");
7072 EXPECT_TRUE(APFloat(APFloat::Float6E3M2FN(), "0").isPosZero());
7073 EXPECT_TRUE(APFloat(APFloat::Float6E3M2FN(), "-0").isNegZero());
7076 TEST(APFloatTest
, Float6E2M3FNFromString
) {
7077 // Exactly representable
7078 EXPECT_EQ(7.5, APFloat(APFloat::Float6E2M3FN(), "7.5").convertToDouble());
7079 // Round down to maximum value
7080 EXPECT_EQ(7.5, APFloat(APFloat::Float6E2M3FN(), "32").convertToDouble());
7082 #ifdef GTEST_HAS_DEATH_TEST
7084 EXPECT_DEATH(APFloat(APFloat::Float6E2M3FN(), "inf"),
7085 "This floating point format does not support Inf");
7086 EXPECT_DEATH(APFloat(APFloat::Float6E2M3FN(), "nan"),
7087 "This floating point format does not support NaN");
7091 EXPECT_TRUE(APFloat(APFloat::Float6E2M3FN(), "0").isPosZero());
7092 EXPECT_TRUE(APFloat(APFloat::Float6E2M3FN(), "-0").isNegZero());
7095 TEST(APFloatTest
, Float4E2M1FNFromString
) {
7096 // Exactly representable
7097 EXPECT_EQ(6, APFloat(APFloat::Float4E2M1FN(), "6").convertToDouble());
7098 // Round down to maximum value
7099 EXPECT_EQ(6, APFloat(APFloat::Float4E2M1FN(), "32").convertToDouble());
7101 #ifdef GTEST_HAS_DEATH_TEST
7103 EXPECT_DEATH(APFloat(APFloat::Float4E2M1FN(), "inf"),
7104 "This floating point format does not support Inf");
7105 EXPECT_DEATH(APFloat(APFloat::Float4E2M1FN(), "nan"),
7106 "This floating point format does not support NaN");
7110 EXPECT_TRUE(APFloat(APFloat::Float4E2M1FN(), "0").isPosZero());
7111 EXPECT_TRUE(APFloat(APFloat::Float4E2M1FN(), "-0").isNegZero());
7114 TEST(APFloatTest
, ConvertE3M2FToE2M3F
) {
7116 APFloat
test(APFloat::Float6E3M2FN(), "1.0");
7117 APFloat::opStatus status
= test
.convert(
7118 APFloat::Float6E2M3FN(), APFloat::rmNearestTiesToEven
, &losesInfo
);
7119 EXPECT_EQ(1.0f
, test
.convertToFloat());
7120 EXPECT_FALSE(losesInfo
);
7121 EXPECT_EQ(status
, APFloat::opOK
);
7123 test
= APFloat(APFloat::Float6E3M2FN(), "0.0");
7124 status
= test
.convert(APFloat::Float6E2M3FN(), APFloat::rmNearestTiesToEven
,
7126 EXPECT_EQ(0.0f
, test
.convertToFloat());
7127 EXPECT_FALSE(losesInfo
);
7128 EXPECT_EQ(status
, APFloat::opOK
);
7131 test
= APFloat(APFloat::Float6E3M2FN(), "28");
7132 status
= test
.convert(APFloat::Float6E2M3FN(), APFloat::rmNearestTiesToEven
,
7134 EXPECT_EQ(7.5f
, test
.convertToFloat());
7135 EXPECT_TRUE(losesInfo
);
7136 EXPECT_EQ(status
, APFloat::opInexact
);
7139 test
= APFloat(APFloat::Float6E3M2FN(), ".0625");
7140 status
= test
.convert(APFloat::Float6E2M3FN(), APFloat::rmNearestTiesToEven
,
7142 EXPECT_EQ(0., test
.convertToFloat());
7143 EXPECT_TRUE(losesInfo
);
7144 EXPECT_EQ(status
, APFloat::opUnderflow
| APFloat::opInexact
);
7146 // Testing inexact rounding to denormal number
7147 test
= APFloat(APFloat::Float6E3M2FN(), "0.1875");
7148 status
= test
.convert(APFloat::Float6E2M3FN(), APFloat::rmNearestTiesToEven
,
7150 EXPECT_EQ(0.25, test
.convertToFloat());
7151 EXPECT_TRUE(losesInfo
);
7152 EXPECT_EQ(status
, APFloat::opUnderflow
| APFloat::opInexact
);
7155 TEST(APFloatTest
, ConvertE2M3FToE3M2F
) {
7157 APFloat
test(APFloat::Float6E2M3FN(), "1.0");
7158 APFloat::opStatus status
= test
.convert(
7159 APFloat::Float6E3M2FN(), APFloat::rmNearestTiesToEven
, &losesInfo
);
7160 EXPECT_EQ(1.0f
, test
.convertToFloat());
7161 EXPECT_FALSE(losesInfo
);
7162 EXPECT_EQ(status
, APFloat::opOK
);
7164 test
= APFloat(APFloat::Float6E2M3FN(), "0.0");
7165 status
= test
.convert(APFloat::Float6E3M2FN(), APFloat::rmNearestTiesToEven
,
7167 EXPECT_EQ(0.0f
, test
.convertToFloat());
7168 EXPECT_FALSE(losesInfo
);
7169 EXPECT_EQ(status
, APFloat::opOK
);
7171 test
= APFloat(APFloat::Float6E2M3FN(), ".125");
7172 status
= test
.convert(APFloat::Float6E3M2FN(), APFloat::rmNearestTiesToEven
,
7174 EXPECT_EQ(.125, test
.convertToFloat());
7175 EXPECT_FALSE(losesInfo
);
7176 EXPECT_EQ(status
, APFloat::opOK
);
7178 // Test inexact rounding
7179 test
= APFloat(APFloat::Float6E2M3FN(), "7.5");
7180 status
= test
.convert(APFloat::Float6E3M2FN(), APFloat::rmNearestTiesToEven
,
7182 EXPECT_EQ(8, test
.convertToFloat());
7183 EXPECT_TRUE(losesInfo
);
7184 EXPECT_EQ(status
, APFloat::opInexact
);
7187 TEST(APFloatTest
, ConvertDoubleToE2M1F
) {
7189 APFloat
test(APFloat::IEEEdouble(), "1.0");
7190 APFloat::opStatus status
= test
.convert(
7191 APFloat::Float4E2M1FN(), APFloat::rmNearestTiesToEven
, &losesInfo
);
7192 EXPECT_EQ(1.0, test
.convertToDouble());
7193 EXPECT_FALSE(losesInfo
);
7194 EXPECT_EQ(status
, APFloat::opOK
);
7196 test
= APFloat(APFloat::IEEEdouble(), "0.0");
7197 status
= test
.convert(APFloat::Float4E2M1FN(), APFloat::rmNearestTiesToEven
,
7199 EXPECT_EQ(0.0f
, test
.convertToDouble());
7200 EXPECT_FALSE(losesInfo
);
7201 EXPECT_EQ(status
, APFloat::opOK
);
7204 test
= APFloat(APFloat::IEEEdouble(), "8");
7205 status
= test
.convert(APFloat::Float4E2M1FN(), APFloat::rmNearestTiesToEven
,
7207 EXPECT_EQ(6, test
.convertToDouble());
7208 EXPECT_TRUE(losesInfo
);
7209 EXPECT_EQ(status
, APFloat::opInexact
);
7212 test
= APFloat(APFloat::IEEEdouble(), "0.25");
7213 status
= test
.convert(APFloat::Float4E2M1FN(), APFloat::rmNearestTiesToEven
,
7215 EXPECT_EQ(0., test
.convertToDouble());
7216 EXPECT_TRUE(losesInfo
);
7217 EXPECT_FALSE(test
.isDenormal());
7218 EXPECT_EQ(status
, APFloat::opUnderflow
| APFloat::opInexact
);
7221 TEST(APFloatTest
, Float6E3M2FNNext
) {
7222 APFloat
test(APFloat::Float6E3M2FN(), APFloat::uninitialized
);
7223 APFloat
expected(APFloat::Float6E3M2FN(), APFloat::uninitialized
);
7225 // 1. NextUp of largest bit pattern is the same
7226 test
= APFloat::getLargest(APFloat::Float6E3M2FN());
7227 expected
= APFloat::getLargest(APFloat::Float6E3M2FN());
7228 EXPECT_EQ(test
.next(false), APFloat::opOK
);
7229 EXPECT_FALSE(test
.isInfinity());
7230 EXPECT_FALSE(test
.isZero());
7231 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
7233 // 2. NextUp of smallest negative denormal is -0
7234 test
= APFloat::getSmallest(APFloat::Float6E3M2FN(), true);
7235 expected
= APFloat::getZero(APFloat::Float6E3M2FN(), true);
7236 EXPECT_EQ(test
.next(false), APFloat::opOK
);
7237 EXPECT_TRUE(test
.isNegZero());
7238 EXPECT_FALSE(test
.isPosZero());
7239 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
7241 // 3. nextDown of negative of largest value is the same
7242 test
= APFloat::getLargest(APFloat::Float6E3M2FN(), true);
7244 EXPECT_EQ(test
.next(true), APFloat::opOK
);
7245 EXPECT_FALSE(test
.isInfinity());
7246 EXPECT_FALSE(test
.isZero());
7247 EXPECT_FALSE(test
.isNaN());
7248 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
7250 // 4. nextDown of +0 is smallest negative denormal
7251 test
= APFloat::getZero(APFloat::Float6E3M2FN(), false);
7252 expected
= APFloat::getSmallest(APFloat::Float6E3M2FN(), true);
7253 EXPECT_EQ(test
.next(true), APFloat::opOK
);
7254 EXPECT_FALSE(test
.isZero());
7255 EXPECT_TRUE(test
.isDenormal());
7256 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
7259 TEST(APFloatTest
, Float6E2M3FNNext
) {
7260 APFloat
test(APFloat::Float6E2M3FN(), APFloat::uninitialized
);
7261 APFloat
expected(APFloat::Float6E2M3FN(), APFloat::uninitialized
);
7263 // 1. NextUp of largest bit pattern is the same
7264 test
= APFloat::getLargest(APFloat::Float6E2M3FN());
7265 expected
= APFloat::getLargest(APFloat::Float6E2M3FN());
7266 EXPECT_EQ(test
.next(false), APFloat::opOK
);
7267 EXPECT_FALSE(test
.isInfinity());
7268 EXPECT_FALSE(test
.isZero());
7269 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
7271 // 2. NextUp of smallest negative denormal is -0
7272 test
= APFloat::getSmallest(APFloat::Float6E2M3FN(), true);
7273 expected
= APFloat::getZero(APFloat::Float6E2M3FN(), true);
7274 EXPECT_EQ(test
.next(false), APFloat::opOK
);
7275 EXPECT_TRUE(test
.isNegZero());
7276 EXPECT_FALSE(test
.isPosZero());
7277 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
7279 // 3. nextDown of negative of largest value is the same
7280 test
= APFloat::getLargest(APFloat::Float6E2M3FN(), true);
7282 EXPECT_EQ(test
.next(true), APFloat::opOK
);
7283 EXPECT_FALSE(test
.isInfinity());
7284 EXPECT_FALSE(test
.isZero());
7285 EXPECT_FALSE(test
.isNaN());
7286 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
7288 // 4. nextDown of +0 is smallest negative denormal
7289 test
= APFloat::getZero(APFloat::Float6E2M3FN(), false);
7290 expected
= APFloat::getSmallest(APFloat::Float6E2M3FN(), true);
7291 EXPECT_EQ(test
.next(true), APFloat::opOK
);
7292 EXPECT_FALSE(test
.isZero());
7293 EXPECT_TRUE(test
.isDenormal());
7294 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
7297 TEST(APFloatTest
, Float4E2M1FNNext
) {
7298 APFloat
test(APFloat::Float4E2M1FN(), APFloat::uninitialized
);
7299 APFloat
expected(APFloat::Float4E2M1FN(), APFloat::uninitialized
);
7301 // 1. NextUp of largest bit pattern is the same
7302 test
= APFloat::getLargest(APFloat::Float4E2M1FN());
7303 expected
= APFloat::getLargest(APFloat::Float4E2M1FN());
7304 EXPECT_EQ(test
.next(false), APFloat::opOK
);
7305 EXPECT_FALSE(test
.isInfinity());
7306 EXPECT_FALSE(test
.isZero());
7307 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
7309 // 2. NextUp of smallest negative denormal is -0
7310 test
= APFloat::getSmallest(APFloat::Float4E2M1FN(), true);
7311 expected
= APFloat::getZero(APFloat::Float4E2M1FN(), true);
7312 EXPECT_EQ(test
.next(false), APFloat::opOK
);
7313 EXPECT_TRUE(test
.isNegZero());
7314 EXPECT_FALSE(test
.isPosZero());
7315 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
7317 // 3. nextDown of negative of largest value is the same
7318 test
= APFloat::getLargest(APFloat::Float4E2M1FN(), true);
7320 EXPECT_EQ(test
.next(true), APFloat::opOK
);
7321 EXPECT_FALSE(test
.isInfinity());
7322 EXPECT_FALSE(test
.isZero());
7323 EXPECT_FALSE(test
.isNaN());
7324 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
7326 // 4. nextDown of +0 is smallest negative denormal
7327 test
= APFloat::getZero(APFloat::Float4E2M1FN(), false);
7328 expected
= APFloat::getSmallest(APFloat::Float4E2M1FN(), true);
7329 EXPECT_EQ(test
.next(true), APFloat::opOK
);
7330 EXPECT_FALSE(test
.isZero());
7331 EXPECT_TRUE(test
.isDenormal());
7332 EXPECT_TRUE(test
.bitwiseIsEqual(expected
));
7335 #ifdef GTEST_HAS_DEATH_TEST
7337 TEST(APFloatTest
, Float6E3M2FNGetInfNaN
) {
7338 EXPECT_DEATH(APFloat::getInf(APFloat::Float6E3M2FN()),
7339 "This floating point format does not support Inf");
7340 EXPECT_DEATH(APFloat::getNaN(APFloat::Float6E3M2FN()),
7341 "This floating point format does not support NaN");
7344 TEST(APFloatTest
, Float6E2M3FNGetInfNaN
) {
7345 EXPECT_DEATH(APFloat::getInf(APFloat::Float6E2M3FN()),
7346 "This floating point format does not support Inf");
7347 EXPECT_DEATH(APFloat::getNaN(APFloat::Float6E2M3FN()),
7348 "This floating point format does not support NaN");
7351 TEST(APFloatTest
, Float4E2M1FNGetInfNaN
) {
7352 EXPECT_DEATH(APFloat::getInf(APFloat::Float4E2M1FN()),
7353 "This floating point format does not support Inf");
7354 EXPECT_DEATH(APFloat::getNaN(APFloat::Float4E2M1FN()),
7355 "This floating point format does not support NaN");
7360 TEST(APFloatTest
, Float6E3M2FNToDouble
) {
7361 APFloat
One(APFloat::Float6E3M2FN(), "1.0");
7362 EXPECT_EQ(1.0, One
.convertToDouble());
7363 APFloat
Two(APFloat::Float6E3M2FN(), "2.0");
7364 EXPECT_EQ(2.0, Two
.convertToDouble());
7365 APFloat PosLargest
= APFloat::getLargest(APFloat::Float6E3M2FN(), false);
7366 EXPECT_EQ(28., PosLargest
.convertToDouble());
7367 APFloat NegLargest
= APFloat::getLargest(APFloat::Float6E3M2FN(), true);
7368 EXPECT_EQ(-28., NegLargest
.convertToDouble());
7369 APFloat PosSmallest
=
7370 APFloat::getSmallestNormalized(APFloat::Float6E3M2FN(), false);
7371 EXPECT_EQ(0x1p
-2, PosSmallest
.convertToDouble());
7372 APFloat NegSmallest
=
7373 APFloat::getSmallestNormalized(APFloat::Float6E3M2FN(), true);
7374 EXPECT_EQ(-0x1p
-2, NegSmallest
.convertToDouble());
7376 APFloat SmallestDenorm
= APFloat::getSmallest(APFloat::Float6E3M2FN(), false);
7377 EXPECT_TRUE(SmallestDenorm
.isDenormal());
7378 EXPECT_EQ(0x0.1p0
, SmallestDenorm
.convertToDouble());
7381 TEST(APFloatTest
, Float6E2M3FNToDouble
) {
7382 APFloat
One(APFloat::Float6E2M3FN(), "1.0");
7383 EXPECT_EQ(1.0, One
.convertToDouble());
7384 APFloat
Two(APFloat::Float6E2M3FN(), "2.0");
7385 EXPECT_EQ(2.0, Two
.convertToDouble());
7386 APFloat PosLargest
= APFloat::getLargest(APFloat::Float6E2M3FN(), false);
7387 EXPECT_EQ(7.5, PosLargest
.convertToDouble());
7388 APFloat NegLargest
= APFloat::getLargest(APFloat::Float6E2M3FN(), true);
7389 EXPECT_EQ(-7.5, NegLargest
.convertToDouble());
7390 APFloat PosSmallest
=
7391 APFloat::getSmallestNormalized(APFloat::Float6E2M3FN(), false);
7392 EXPECT_EQ(0x1p
0, PosSmallest
.convertToDouble());
7393 APFloat NegSmallest
=
7394 APFloat::getSmallestNormalized(APFloat::Float6E2M3FN(), true);
7395 EXPECT_EQ(-0x1p
0, NegSmallest
.convertToDouble());
7397 APFloat SmallestDenorm
= APFloat::getSmallest(APFloat::Float6E2M3FN(), false);
7398 EXPECT_TRUE(SmallestDenorm
.isDenormal());
7399 EXPECT_EQ(0x0.2p0
, SmallestDenorm
.convertToDouble());
7402 TEST(APFloatTest
, Float4E2M1FNToDouble
) {
7403 APFloat
One(APFloat::Float4E2M1FN(), "1.0");
7404 EXPECT_EQ(1.0, One
.convertToDouble());
7405 APFloat
Two(APFloat::Float4E2M1FN(), "2.0");
7406 EXPECT_EQ(2.0, Two
.convertToDouble());
7407 APFloat PosLargest
= APFloat::getLargest(APFloat::Float4E2M1FN(), false);
7408 EXPECT_EQ(6, PosLargest
.convertToDouble());
7409 APFloat NegLargest
= APFloat::getLargest(APFloat::Float4E2M1FN(), true);
7410 EXPECT_EQ(-6, NegLargest
.convertToDouble());
7411 APFloat PosSmallest
=
7412 APFloat::getSmallestNormalized(APFloat::Float4E2M1FN(), false);
7413 EXPECT_EQ(0x1p
0, PosSmallest
.convertToDouble());
7414 APFloat NegSmallest
=
7415 APFloat::getSmallestNormalized(APFloat::Float4E2M1FN(), true);
7416 EXPECT_EQ(-0x1p
0, NegSmallest
.convertToDouble());
7418 APFloat SmallestDenorm
= APFloat::getSmallest(APFloat::Float4E2M1FN(), false);
7419 EXPECT_TRUE(SmallestDenorm
.isDenormal());
7420 EXPECT_EQ(0x0.8p0
, SmallestDenorm
.convertToDouble());
7423 TEST(APFloatTest
, Float6E3M2FNToFloat
) {
7424 APFloat PosZero
= APFloat::getZero(APFloat::Float6E3M2FN());
7425 APFloat
PosZeroToFloat(PosZero
.convertToFloat());
7426 EXPECT_TRUE(PosZeroToFloat
.isPosZero());
7427 APFloat NegZero
= APFloat::getZero(APFloat::Float6E3M2FN(), true);
7428 APFloat
NegZeroToFloat(NegZero
.convertToFloat());
7429 EXPECT_TRUE(NegZeroToFloat
.isNegZero());
7431 APFloat
One(APFloat::Float6E3M2FN(), "1.0");
7432 EXPECT_EQ(1.0F
, One
.convertToFloat());
7433 APFloat
Two(APFloat::Float6E3M2FN(), "2.0");
7434 EXPECT_EQ(2.0F
, Two
.convertToFloat());
7436 APFloat PosLargest
= APFloat::getLargest(APFloat::Float6E3M2FN(), false);
7437 EXPECT_EQ(28., PosLargest
.convertToFloat());
7438 APFloat NegLargest
= APFloat::getLargest(APFloat::Float6E3M2FN(), true);
7439 EXPECT_EQ(-28, NegLargest
.convertToFloat());
7440 APFloat PosSmallest
=
7441 APFloat::getSmallestNormalized(APFloat::Float6E3M2FN(), false);
7442 EXPECT_EQ(0x1p
-2, PosSmallest
.convertToFloat());
7443 APFloat NegSmallest
=
7444 APFloat::getSmallestNormalized(APFloat::Float6E3M2FN(), true);
7445 EXPECT_EQ(-0x1p
-2, NegSmallest
.convertToFloat());
7447 APFloat SmallestDenorm
= APFloat::getSmallest(APFloat::Float6E3M2FN(), false);
7448 EXPECT_TRUE(SmallestDenorm
.isDenormal());
7449 EXPECT_EQ(0x0.1p0
, SmallestDenorm
.convertToFloat());
7452 TEST(APFloatTest
, Float6E2M3FNToFloat
) {
7453 APFloat PosZero
= APFloat::getZero(APFloat::Float6E2M3FN());
7454 APFloat
PosZeroToFloat(PosZero
.convertToFloat());
7455 EXPECT_TRUE(PosZeroToFloat
.isPosZero());
7456 APFloat NegZero
= APFloat::getZero(APFloat::Float6E2M3FN(), true);
7457 APFloat
NegZeroToFloat(NegZero
.convertToFloat());
7458 EXPECT_TRUE(NegZeroToFloat
.isNegZero());
7460 APFloat
One(APFloat::Float6E2M3FN(), "1.0");
7461 EXPECT_EQ(1.0F
, One
.convertToFloat());
7462 APFloat
Two(APFloat::Float6E2M3FN(), "2.0");
7463 EXPECT_EQ(2.0F
, Two
.convertToFloat());
7465 APFloat PosLargest
= APFloat::getLargest(APFloat::Float6E2M3FN(), false);
7466 EXPECT_EQ(7.5, PosLargest
.convertToFloat());
7467 APFloat NegLargest
= APFloat::getLargest(APFloat::Float6E2M3FN(), true);
7468 EXPECT_EQ(-7.5, NegLargest
.convertToFloat());
7469 APFloat PosSmallest
=
7470 APFloat::getSmallestNormalized(APFloat::Float6E2M3FN(), false);
7471 EXPECT_EQ(0x1p
0, PosSmallest
.convertToFloat());
7472 APFloat NegSmallest
=
7473 APFloat::getSmallestNormalized(APFloat::Float6E2M3FN(), true);
7474 EXPECT_EQ(-0x1p
0, NegSmallest
.convertToFloat());
7476 APFloat SmallestDenorm
= APFloat::getSmallest(APFloat::Float6E2M3FN(), false);
7477 EXPECT_TRUE(SmallestDenorm
.isDenormal());
7478 EXPECT_EQ(0x0.2p0
, SmallestDenorm
.convertToFloat());
7481 TEST(APFloatTest
, Float4E2M1FNToFloat
) {
7482 APFloat PosZero
= APFloat::getZero(APFloat::Float4E2M1FN());
7483 APFloat
PosZeroToFloat(PosZero
.convertToFloat());
7484 EXPECT_TRUE(PosZeroToFloat
.isPosZero());
7485 APFloat NegZero
= APFloat::getZero(APFloat::Float4E2M1FN(), true);
7486 APFloat
NegZeroToFloat(NegZero
.convertToFloat());
7487 EXPECT_TRUE(NegZeroToFloat
.isNegZero());
7489 APFloat
One(APFloat::Float4E2M1FN(), "1.0");
7490 EXPECT_EQ(1.0F
, One
.convertToFloat());
7491 APFloat
Two(APFloat::Float4E2M1FN(), "2.0");
7492 EXPECT_EQ(2.0F
, Two
.convertToFloat());
7494 APFloat PosLargest
= APFloat::getLargest(APFloat::Float4E2M1FN(), false);
7495 EXPECT_EQ(6, PosLargest
.convertToFloat());
7496 APFloat NegLargest
= APFloat::getLargest(APFloat::Float4E2M1FN(), true);
7497 EXPECT_EQ(-6, NegLargest
.convertToFloat());
7498 APFloat PosSmallest
=
7499 APFloat::getSmallestNormalized(APFloat::Float4E2M1FN(), false);
7500 EXPECT_EQ(0x1p
0, PosSmallest
.convertToFloat());
7501 APFloat NegSmallest
=
7502 APFloat::getSmallestNormalized(APFloat::Float4E2M1FN(), true);
7503 EXPECT_EQ(-0x1p
0, NegSmallest
.convertToFloat());
7505 APFloat SmallestDenorm
= APFloat::getSmallest(APFloat::Float4E2M1FN(), false);
7506 EXPECT_TRUE(SmallestDenorm
.isDenormal());
7507 EXPECT_EQ(0x0.8p0
, SmallestDenorm
.convertToFloat());