fp80_cvtf.c revision 9888
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 <assert.h> 359888Sandreas@sandberg.pp.se#include <math.h> 369888Sandreas@sandberg.pp.se#include <stdio.h> 379888Sandreas@sandberg.pp.se#include <stdlib.h> 389888Sandreas@sandberg.pp.se 399888Sandreas@sandberg.pp.sestatic void 409888Sandreas@sandberg.pp.setest_cvtf(const char *name, double fin) 419888Sandreas@sandberg.pp.se{ 429888Sandreas@sandberg.pp.se fp80_t v80 = fp80_cvfd(fin); 439888Sandreas@sandberg.pp.se double v64 = fp80_cvtd(v80); 449888Sandreas@sandberg.pp.se 459888Sandreas@sandberg.pp.se test_diag("Conversion '%e' -> fp80 -> double: %e", fin, v64); 469888Sandreas@sandberg.pp.se 479888Sandreas@sandberg.pp.se printf("# "); 489888Sandreas@sandberg.pp.se fp80_debug_dump(stdout, v80); 499888Sandreas@sandberg.pp.se if (v64 == fin || 509888Sandreas@sandberg.pp.se (isnan(fin) && isnan(v64) && signbit(fin) == signbit(v64))) { 519888Sandreas@sandberg.pp.se test_ok(name); 529888Sandreas@sandberg.pp.se } else { 539888Sandreas@sandberg.pp.se test_diag("MISMATCH: %e != %e", fin, v64); 549888Sandreas@sandberg.pp.se test_fail(name); 559888Sandreas@sandberg.pp.se } 569888Sandreas@sandberg.pp.se} 579888Sandreas@sandberg.pp.se 589888Sandreas@sandberg.pp.sestatic void 599888Sandreas@sandberg.pp.setest_cvtf_exp(const char *name, double x, int exp) 609888Sandreas@sandberg.pp.se{ 619888Sandreas@sandberg.pp.se double val = ldexp(x, exp); 629888Sandreas@sandberg.pp.se test_cvtf(name, val); 639888Sandreas@sandberg.pp.se} 649888Sandreas@sandberg.pp.se 659888Sandreas@sandberg.pp.seint 669888Sandreas@sandberg.pp.semain(int argc, char *argv[]) 679888Sandreas@sandberg.pp.se{ 689888Sandreas@sandberg.pp.se test_init(9); 699888Sandreas@sandberg.pp.se 709888Sandreas@sandberg.pp.se test_cvtf("+inf", -INFINITY); 719888Sandreas@sandberg.pp.se test_cvtf("-inf", INFINITY); 729888Sandreas@sandberg.pp.se test_cvtf("+nan", NAN); 739888Sandreas@sandberg.pp.se test_cvtf("-nan", -NAN); 749888Sandreas@sandberg.pp.se test_cvtf("+0", 0); 759888Sandreas@sandberg.pp.se test_cvtf("PI", M_PI); 769888Sandreas@sandberg.pp.se 779888Sandreas@sandberg.pp.se test_cvtf_exp("smallest normal", 1.0, -1022); 789888Sandreas@sandberg.pp.se test_cvtf_exp("denormal1", 0.5, -1022); 799888Sandreas@sandberg.pp.se test_cvtf_exp("denormal2", 0.25, -1022); 809888Sandreas@sandberg.pp.se 819888Sandreas@sandberg.pp.se test_exit(); 829888Sandreas@sandberg.pp.se} 83