19888Sandreas@sandberg.pp.se/* 29888Sandreas@sandberg.pp.se * Copyright (c) 2013, Andreas Sandberg 39888Sandreas@sandberg.pp.se * All rights reserved. 49888Sandreas@sandberg.pp.se * 59888Sandreas@sandberg.pp.se * Redistribution and use in source and binary forms, with or without 69888Sandreas@sandberg.pp.se * modification, are permitted provided that the following conditions 79888Sandreas@sandberg.pp.se * are met: 89888Sandreas@sandberg.pp.se * 99888Sandreas@sandberg.pp.se * 1. Redistributions of source code must retain the above copyright 109888Sandreas@sandberg.pp.se * notice, this list of conditions and the following disclaimer. 119888Sandreas@sandberg.pp.se * 2. Redistributions in binary form must reproduce the above 129888Sandreas@sandberg.pp.se * copyright notice, this list of conditions and the following 139888Sandreas@sandberg.pp.se * disclaimer in the documentation and/or other materials provided 149888Sandreas@sandberg.pp.se * with the distribution. 159888Sandreas@sandberg.pp.se * 169888Sandreas@sandberg.pp.se * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179888Sandreas@sandberg.pp.se * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189888Sandreas@sandberg.pp.se * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 199888Sandreas@sandberg.pp.se * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 209888Sandreas@sandberg.pp.se * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 219888Sandreas@sandberg.pp.se * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 229888Sandreas@sandberg.pp.se * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 239888Sandreas@sandberg.pp.se * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 249888Sandreas@sandberg.pp.se * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 259888Sandreas@sandberg.pp.se * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 269888Sandreas@sandberg.pp.se * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 279888Sandreas@sandberg.pp.se * OF THE POSSIBILITY OF SUCH DAMAGE. 289888Sandreas@sandberg.pp.se */ 299888Sandreas@sandberg.pp.se 309888Sandreas@sandberg.pp.se#include <fputils/fp80.h> 319888Sandreas@sandberg.pp.se 329888Sandreas@sandberg.pp.se#include "test_helper.h" 339888Sandreas@sandberg.pp.se 349888Sandreas@sandberg.pp.se#include <math.h> 359888Sandreas@sandberg.pp.se#include <stdio.h> 369888Sandreas@sandberg.pp.se#include <stdlib.h> 379888Sandreas@sandberg.pp.se 389899Sandreas@sandberg.pp.se/* We provide our own version of isinf_sgn since the C99 standard 399899Sandreas@sandberg.pp.se * doesn't guarantee that isinf() returns the sign of the infinity 409899Sandreas@sandberg.pp.se * (most implementations do). */ 419899Sandreas@sandberg.pp.sestatic inline int 429899Sandreas@sandberg.pp.seisinf_sgn(double x) 439899Sandreas@sandberg.pp.se{ 449899Sandreas@sandberg.pp.se return isinf(x) ? (signbit(x) ? -1 : 1) : 0; 459899Sandreas@sandberg.pp.se} 469899Sandreas@sandberg.pp.se 479888Sandreas@sandberg.pp.sestatic void 489888Sandreas@sandberg.pp.setest_fp80_cvtd_class(const char *name, fp80_t fin, int class) 499888Sandreas@sandberg.pp.se{ 509888Sandreas@sandberg.pp.se double d = fp80_cvtd(fin); 519888Sandreas@sandberg.pp.se if (fpclassify(d) != class) { 529888Sandreas@sandberg.pp.se test_diag("wrong class"); 539888Sandreas@sandberg.pp.se test_fail(name); 549888Sandreas@sandberg.pp.se } else { 559888Sandreas@sandberg.pp.se test_ok(name); 569888Sandreas@sandberg.pp.se } 579888Sandreas@sandberg.pp.se} 589888Sandreas@sandberg.pp.se 599888Sandreas@sandberg.pp.sestatic void 609899Sandreas@sandberg.pp.setest_fp80_cvtd_inf(const char *name, fp80_t fin, int expected_inf_class) 619888Sandreas@sandberg.pp.se{ 629888Sandreas@sandberg.pp.se double d = fp80_cvtd(fin); 639899Sandreas@sandberg.pp.se if (isinf_sgn(d) != expected_inf_class) { 649888Sandreas@sandberg.pp.se test_diag("wrong infinity type"); 659888Sandreas@sandberg.pp.se test_fail(name); 669888Sandreas@sandberg.pp.se } else { 679888Sandreas@sandberg.pp.se test_ok(name); 689888Sandreas@sandberg.pp.se } 699888Sandreas@sandberg.pp.se} 709888Sandreas@sandberg.pp.se 719888Sandreas@sandberg.pp.seint 729888Sandreas@sandberg.pp.semain(int argc, char *argv[]) 739888Sandreas@sandberg.pp.se{ 749888Sandreas@sandberg.pp.se test_init(6); 759888Sandreas@sandberg.pp.se 769888Sandreas@sandberg.pp.se test_fp80_cvtd_inf("fp80->double +inf", fp80_pinf, 1); 779888Sandreas@sandberg.pp.se test_fp80_cvtd_inf("fp80->double -inf", fp80_ninf, -1); 789888Sandreas@sandberg.pp.se test_fp80_cvtd_class("fp80->double qnan", fp80_qnan, FP_NAN); 799888Sandreas@sandberg.pp.se test_fp80_cvtd_class("fp80->double qnani", fp80_qnani, FP_NAN); 809888Sandreas@sandberg.pp.se test_fp80_cvtd_class("fp80->double snan", fp80_snan, FP_NAN); 819888Sandreas@sandberg.pp.se test_fp80_cvtd_class("fp80->double nan", fp80_nan, FP_NAN); 829888Sandreas@sandberg.pp.se 839888Sandreas@sandberg.pp.se test_exit(); 849888Sandreas@sandberg.pp.se} 85