Commit 491611cb632d41dfefbdafc60a058eee51457e0e
- Diff rendering mode:
- inline
- side by side
stlport/stl/_limits.h
(12 / 12)
|   | |||
| 371 | 371 | static F qnan() _STLP_NOTHROW | |
| 372 | 372 | { | |
| 373 | 373 | # if defined (_STLP_BIG_ENDIAN) | |
| 374 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0x7f, 0 _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 374 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0x7e, 0 _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 375 | 375 | # else /* _STLP_LITTLE_ENDIAN */ | |
| 376 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0, 0x7f _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 376 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0, 0x7e _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 377 | 377 | # endif | |
| 378 | 378 | return tmp.f; | |
| 379 | 379 | } | |
| … | … | ||
| 421 | 421 | static F qnan() _STLP_NOTHROW | |
| 422 | 422 | { | |
| 423 | 423 | # if defined (_STLP_BIG_ENDIAN) | |
| 424 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0x7f, 0xe0, 0, 0 _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 424 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0x7f, 0xc0, 0, 0 _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 425 | 425 | # else /* _STLP_LITTLE_ENDIAN */ | |
| 426 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0, 0, 0xe0, 0x7f _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 426 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0, 0, 0xc0, 0x7f _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 427 | 427 | # endif | |
| 428 | 428 | return tmp.f; | |
| 429 | 429 | } | |
| … | … | ||
| 471 | 471 | static F qnan() _STLP_NOTHROW | |
| 472 | 472 | { | |
| 473 | 473 | # if defined (_STLP_BIG_ENDIAN) | |
| 474 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0x7f, 0xfc, 0, 0, 0, 0, 0, 0 _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 474 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0x7f, 0xf8, 0, 0, 0, 0, 0, 0 _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 475 | 475 | # else /* _STLP_LITTLE_ENDIAN */ | |
| 476 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0, 0, 0, 0, 0, 0, 0xfc, 0x7f _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 476 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0, 0, 0, 0, 0, 0, 0xf8, 0x7f _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 477 | 477 | # endif | |
| 478 | 478 | return tmp.f; | |
| 479 | 479 | } | |
| … | … | ||
| 481 | 481 | static F snan() _STLP_NOTHROW | |
| 482 | 482 | { | |
| 483 | 483 | # if defined (_STLP_BIG_ENDIAN) | |
| 484 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0x7f, 0xf6, 0, 0, 0, 0, 0, 0 _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 484 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0x7f, 0xf4, 0, 0, 0, 0, 0, 0 _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 485 | 485 | # else /* _STLP_LITTLE_ENDIAN */ | |
| 486 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0, 0, 0, 0, 0, 0, 0xf6, 0x7f _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 486 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0, 0, 0, 0, 0, 0, 0xf4, 0x7f _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 487 | 487 | # endif | |
| 488 | 488 | return tmp.f; | |
| 489 | 489 | } | |
| … | … | ||
| 529 | 529 | static F qnan() _STLP_NOTHROW | |
| 530 | 530 | { | |
| 531 | 531 | # if defined (_STLP_BIG_ENDIAN) | |
| 532 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0x7f, 0xff, 0xc0, 0, 0, 0, 0, 0, 0, 0 _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 532 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0x7f, 0xff, 0x80, 0, 0, 0, 0, 0, 0, 0 _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 533 | 533 | # else /* _STLP_LITTLE_ENDIAN */ | |
| 534 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0, 0, 0, 0, 0, 0, 0, 0xc0, 0xff, 0x7f _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 534 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0, 0, 0, 0, 0, 0, 0, 0x80, 0xff, 0x7f _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 535 | 535 | # endif | |
| 536 | 536 | return tmp.f; | |
| 537 | 537 | } | |
| … | … | ||
| 599 | 599 | static F snan() _STLP_NOTHROW | |
| 600 | 600 | { | |
| 601 | 601 | # if defined (_STLP_BIG_ENDIAN) | |
| 602 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0x7f, 0xff, 0, 0, 0x40, 0, 0, 0, 0, 0, 0, 0 _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 602 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0x7f, 0xff, 0, 0, 0xa0, 0, 0, 0, 0, 0, 0, 0 _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 603 | 603 | # else /* _STLP_LITTLE_ENDIAN */ | |
| 604 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0, 0, 0, 0, 0, 0, 0, 0x40, 0xff, 0x7f, 0, 0 _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 604 | _access tmp = { _STLP_ADDITIONAL_OPEN_BRACKET 0, 0, 0, 0, 0, 0, 0, 0xa0, 0xff, 0x7f, 0, 0 _STLP_ADDITIONAL_CLOSE_BRACKET }; | ||
| 605 | 605 | # endif | |
| 606 | 606 | return tmp.f; | |
| 607 | 607 | } |
test/unit/limits_test.cpp
(118 / 0)
|   | |||
| 16 | 16 | ||
| 17 | 17 | #include <limits> | |
| 18 | 18 | ||
| 19 | #include <ieee754.h> | ||
| 20 | |||
| 19 | 21 | using namespace std; | |
| 20 | 22 | ||
| 21 | 23 | bool valid_sign_info(bool, bool) | |
| … | … | ||
| 227 | 227 | * EXAM_CHECK_ASYNC(! (qnan <= 42)); | |
| 228 | 228 | * EXAM_CHECK_ASYNC(! (qnan >= 42)); | |
| 229 | 229 | */ | |
| 230 | |||
| 231 | if ( is_same<float,_Tp>::value ) { | ||
| 232 | ieee754_float v; | ||
| 233 | v.f = qnan; | ||
| 234 | EXAM_CHECK( v.ieee_nan.quiet_nan == 1 ); | ||
| 235 | } | ||
| 236 | |||
| 237 | if ( is_same<double,_Tp>::value ) { | ||
| 238 | ieee754_double v; | ||
| 239 | v.d = qnan; | ||
| 240 | EXAM_CHECK( v.ieee_nan.quiet_nan == 1 ); | ||
| 241 | } | ||
| 242 | |||
| 243 | # if !defined ( _STLP_NO_LONG_DOUBLE ) | ||
| 244 | if ( is_same<long double,_Tp>::value ) { | ||
| 245 | ieee854_long_double v; | ||
| 246 | v.d = qnan; | ||
| 247 | EXAM_CHECK( v.ieee_nan.quiet_nan == 1 ); | ||
| 248 | } | ||
| 249 | # endif | ||
| 230 | 250 | } | |
| 251 | |||
| 231 | 252 | return EXAM_RESULT; | |
| 232 | 253 | } | |
| 233 | 254 | ||
| 255 | volatile const double& fdbl() | ||
| 256 | { | ||
| 257 | volatile static ieee754_double v1; | ||
| 234 | 258 | ||
| 259 | v1.ieee.negative = 0; | ||
| 260 | v1.ieee.exponent = 0x7ff; | ||
| 261 | v1.ieee.mantissa0 = 0x40000; | ||
| 262 | v1.ieee.mantissa1 = 0x0; | ||
| 263 | |||
| 264 | return v1.d; | ||
| 265 | } | ||
| 266 | |||
| 267 | template <class _Tp> | ||
| 268 | int EXAM_IMPL(test_snan) | ||
| 269 | { | ||
| 270 | typedef numeric_limits<_Tp> lim; | ||
| 271 | |||
| 272 | if (lim::has_signaling_NaN) { | ||
| 273 | const volatile _Tp snan = lim::signaling_NaN(); | ||
| 274 | |||
| 275 | //if (sizeof(_Tp) == 4) { | ||
| 276 | // ostringstream str; | ||
| 277 | // str << "qnan " << qnan << ", in hexa: " << showbase << hex << *((unsigned int*)&qnan); | ||
| 278 | // EXAM_MESSAGE( str.str().c_str() ); | ||
| 279 | // str.str(""); | ||
| 280 | // float val = generate_nan(0.0f); | ||
| 281 | // str << "val " << val << ", in hexa: " << showbase << hex << *((unsigned int*)&val); | ||
| 282 | // EXAM_MESSAGE( str.str().c_str() ); | ||
| 283 | // str.str(""); | ||
| 284 | // val = -qnan; | ||
| 285 | // str << "-qnan " << val << ", in hexa: " << showbase << hex << *((unsigned int*)&val); | ||
| 286 | // EXAM_MESSAGE( str.str().c_str() ); | ||
| 287 | //} | ||
| 288 | /* NaNs shall always compare "false" when compared for equality | ||
| 289 | * If one of these fail, your compiler may be optimizing incorrectly, | ||
| 290 | * or the STLport is incorrectly configured. | ||
| 291 | */ | ||
| 292 | EXAM_CHECK( !(snan == 42)); | ||
| 293 | EXAM_CHECK( !(snan == snan)); | ||
| 294 | EXAM_CHECK( snan != 42); | ||
| 295 | EXAM_CHECK( snan != snan); | ||
| 296 | |||
| 297 | /* The following tests may cause arithmetic traps. | ||
| 298 | * EXAM_CHECK_ASYNC(! (snan < 42)); | ||
| 299 | * EXAM_CHECK_ASYNC(! (snan > 42)); | ||
| 300 | * EXAM_CHECK_ASYNC(! (snan <= 42)); | ||
| 301 | * EXAM_CHECK_ASYNC(! (snan >= 42)); | ||
| 302 | */ | ||
| 303 | |||
| 304 | if ( is_same<float,_Tp>::value ) { | ||
| 305 | ieee754_float v; | ||
| 306 | v.f = snan; | ||
| 307 | EXAM_CHECK( v.ieee_nan.quiet_nan == 0 ); | ||
| 308 | } | ||
| 309 | |||
| 310 | if ( is_same<double,_Tp>::value ) { | ||
| 311 | ieee754_double v; | ||
| 312 | v.d = snan; | ||
| 313 | printf( "%1x %03x %05x %08x\n", v.ieee.negative, v.ieee.exponent, v.ieee.mantissa0, v.ieee.mantissa1 ); | ||
| 314 | |||
| 315 | ieee754_double v1; | ||
| 316 | |||
| 317 | v1.ieee.negative = 0; | ||
| 318 | v1.ieee.exponent = 0x7ff; | ||
| 319 | v1.ieee.mantissa0 = 0x40000; | ||
| 320 | v1.ieee.mantissa1 = 0x0; | ||
| 321 | |||
| 322 | printf( "%1x %03x %05x %08x\n", v1.ieee.negative, v1.ieee.exponent, v1.ieee.mantissa0, v1.ieee.mantissa1 ); | ||
| 323 | |||
| 324 | // double db = v1.d; | ||
| 325 | |||
| 326 | v1.d = fdbl(); | ||
| 327 | |||
| 328 | printf( "%1x %03x %05x %08x\n", v1.ieee.negative, v1.ieee.exponent, v1.ieee.mantissa0, v1.ieee.mantissa1 ); | ||
| 329 | |||
| 330 | EXAM_CHECK( v.ieee_nan.quiet_nan == 0 ); | ||
| 331 | } | ||
| 332 | |||
| 333 | # if !defined ( _STLP_NO_LONG_DOUBLE ) | ||
| 334 | if ( is_same<long double,_Tp>::value ) { | ||
| 335 | ieee854_long_double v; | ||
| 336 | v.d = snan; | ||
| 337 | EXAM_CHECK( v.ieee_nan.quiet_nan == 0 ); | ||
| 338 | } | ||
| 339 | # endif | ||
| 340 | } | ||
| 341 | |||
| 342 | return EXAM_RESULT; | ||
| 343 | } | ||
| 344 | |||
| 235 | 345 | class ArbitraryType | |
| 236 | 346 | {}; | |
| 237 | 347 | ||
| … | … | ||
| 406 | 406 | EXAM_RESULT |= test_qnan<double>( __exam_ts, 0 ); | |
| 407 | 407 | # if !defined ( _STLP_NO_LONG_DOUBLE ) | |
| 408 | 408 | EXAM_RESULT |= test_qnan<long double>( __exam_ts, 0 ); | |
| 409 | # endif | ||
| 410 | |||
| 411 | EXAM_RESULT |= test_snan<float>( __exam_ts, 0 ); | ||
| 412 | EXAM_RESULT |= test_snan<double>( __exam_ts, 0 ); | ||
| 413 | # if !defined ( _STLP_NO_LONG_DOUBLE ) | ||
| 414 | EXAM_RESULT |= test_snan<long double>( __exam_ts, 0 ); | ||
| 409 | 415 | # endif | |
| 410 | 416 | ||
| 411 | 417 | # if defined (__BORLANDC__) |

