34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# CDDL HEADER START
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# The contents of this file are subject to the terms of the
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Common Development and Distribution License (the "License").
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# You may not use this file except in compliance with the License.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# or http://www.opensolaris.org/os/licensing.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# See the License for the specific language governing permissions
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# and limitations under the License.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# When distributing Covered Code, include this CDDL HEADER in each
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# If applicable, add the following below this CDDL HEADER, with the
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# fields enclosed by brackets "[]" replaced with your own identifying
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# information: Portions Copyright [yyyy] [name of copyright owner]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# CDDL HEADER END
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# This test checks whether arithmetric math correctly supports
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# negative zero values
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# This was reported as CR #6789247 ("libast/ksh93 1-digit hexfloat base conversion rounds incorrectly"):
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# ---- snip ----
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Description
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# [The same issue was described in http://mail.opensolaris.org/pipermail/ksh93-integration-discuss/2008-December/006737.html]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# This is basically a spin-off of http://bugs.opensolaris.org/view_bug.do?bug_id=6773712 ("1-digit hex fp
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# base conversion of long double rounds incorrectly").
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# The bug description for Solaris libc says this:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# > The first line of output from this program is correct. The second line
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# > is not.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# >
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# > leviathan% cat a.c
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# > #include <stdio.h>
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# >
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# > int main()
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# > {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# > printf("%.0a\n", 1.5);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# > printf("%.0La\n", 1.5L);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# > return 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# > }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# > leviathan% cc -o a a.c
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# > leviathan% a
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# > 0x1p+1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# > 0x1p+0
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# > leviathan%
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# If I compile the testcase with libast on Solaris 11/B84 SPARC (which
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# matches ast-open.2008-11-04) I get this:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# -- snip --
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# $ cc -xc99=%all -I/usr/include/ast -last a.c -o a &&
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# ./a
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# 0x1p+00
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# 0x1p+00
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# -- snip --
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# ... which seems to be incorrect per the bugs comment above and should
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# be:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# -- snip --
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# 0x1p+1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# 0x1p+1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# -- snip --
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# ksh93 has the same problem:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# $ ksh93 -c 'float r=1.5 ; printf "%.0a\n" r'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# 0x1p+00
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Steps to Reproduce
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Compile and run testcase like this:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# -- snip --
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# $ cc -xc99=%all -I/usr/include/ast -last a.c -o a &&
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# ./a
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# -- snip --
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Expected Result
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# 0x1p+1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# 0x1p+1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Actual Result
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# 0x1p+00
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# 0x1p+00
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# ---- snip ----
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# test setup
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfunction err_exit
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -u2 -n "\t"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -u2 -r ${Command}[$1]: "${@:2}"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner (( Errors < 127 && Errors++ ))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzalias err_exit='err_exit $LINENO'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzset -o nounset
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzCommand=${0##*/}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzinteger Errors=0
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfloat r
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfloat result
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztypeset str
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Test #001/a - check whether the result of a rounded 1.5 is 2.0
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzr=1.5
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzresult=$(printf "%.0a\n" r) || err_exit "printf returned non-zero exit code"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz(( result == 2.0 )) || err_exit "result expected to be 2.0, got ${result}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Test #001/b - same as test #001/a but uses "%.0A\n" instead of "%.0a\n"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzr=1.5
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzresult=$(printf "%.0A\n" r) || err_exit "printf returned non-zero exit code"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz(( result == 2.0 )) || err_exit "result expected to be 2.0, got ${result}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Test #002/a - check whether the hexfloat string value matches the expected pattern
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzr=1.5
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstr=$(printf "%.0a\n" r) || err_exit "printf returned non-zero exit code"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ "${str}" == ~(Glri)0x0*1p\+0*1 ]] || err_exit "str expected to match ~(Glri)0x0*1p\+0*1, got |${str}|"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Test #002/b - same as test #002/a but uses "%.0A\n" instead of "%.0a\n"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzr=1.5
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstr=$(printf "%.0A\n" r) || err_exit "printf returned non-zero exit code"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ "${str}" == ~(Glri)0x0*1p\+0*1 ]] || err_exit "str expected to match ~(Glri)0x0*1p\+0*1, got |${str}|"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# tests done
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexit $((Errors))