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 #6805795 ("[ku1] ksh93 does not differ between -0 and +0"):
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# ------------ snip ------------
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Original bug report was:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# ------ snip ------
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Is there a reason why ksh93 does not display the negative sign for the
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# value zero ? For example if I have use the C99 function "copysign"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# (copies absolute value of operant a and sign of operant b) I get this
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# for { a=5, b=-0 }:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# -- snip --
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# $ ksh93 -c 'float x; (( x=copysign(5, -0) )) ; printf "%f\n"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# x'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# -5.000000
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# -- snip --
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Now if I swap operands a and b I get this result:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# -- snip --
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# $ ksh93 -c 'float x; (( x=copysign(0, -5) )) ; printf "%f\n" x'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# 0.000000
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# -- snip --
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# AFAIK this result should be "-0.000000" ... or not ?
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# BTW: Parsing of "-0" doesn't seem to work either, e.g.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# -- snip --
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# $ ksh93 -c 'float x a=-1 b=-0; (( x=copysign(a, b) )) ; printf "%f\n"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# x'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# 1.000000
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# -- snip --
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# ... while AFAIK it should be "-1.000000" since the 2nd operand of
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# "copysign" defines the sign of the result.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# ------ snip ------
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 Mainztypeset str
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# test 1: test "copysign()" using constant values
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstr=$(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz set -o errexit
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -- $(( copysign(0, -5) ))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ) || err_exit "test failed."
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ "${str}" == "-0" ]] || err_exit "Expected copysign(0, -5) == -0, got ${str}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# test 2: Same as test 1 but using variables for the values
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstr=$(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz set -o errexit
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz float a
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz float b
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz float c
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz a=0.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz b=-5.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz (( c=copysign(a, b) ))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -- "$c"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ) || err_exit "test failed."
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ "${str}" == "-0" ]] || err_exit "Expected c == -0, got ${str}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# test 3: test "signbit()"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstr=$(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz set -o errexit
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz float a
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz a=-0.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -- $(( signbit(a) ))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ) || err_exit "test failed."
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ "${str}" == "1" ]] || err_exit "Expected signbit(a, b) == 1, got ${str}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# test 4: test "signbit()"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstr=$(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz set -o errexit
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz float a
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz float c
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz a=-0.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz (( c=signbit(a) ))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -- "$c"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ) || err_exit "test failed."
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ "${str}" == "1" ]] || err_exit "Expected c == 1, got ${str}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# test 5: test whether "typeset -X" (C99 "hexfloat") correctly recognizes
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# negative zero assigned from a "float"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstr=$(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz set -o errexit
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz float a # float
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset -X c # hexfloat
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz a=-0.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz # copy value from "float" to "hexfloat"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz (( c=a ))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -- "$c"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ) || err_exit "test failed."
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ "${str}" == -0x* ]] || err_exit "Expected c == -0x*, got ${str}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# test 6: Reverse of test 5: Test whether "float" correctly recognizes
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# a C99 "hexfloat" value
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstr=$(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz set -o errexit
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset -X a # hexfloat
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz float c # float
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz a=-0x0.0000000000000000000000000000p+00
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz # copy value from "hexfloat" to "float"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz (( c=a ))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -- "$c"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ) || err_exit "test failed."
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ "${str}" == "-0" ]] || err_exit "Expected c == -0, got ${str}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# tests done
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexit $((Errors))