134f9b3eeSRoland Mainz# 234f9b3eeSRoland Mainz# CDDL HEADER START 334f9b3eeSRoland Mainz# 434f9b3eeSRoland Mainz# The contents of this file are subject to the terms of the 534f9b3eeSRoland Mainz# Common Development and Distribution License (the "License"). 634f9b3eeSRoland Mainz# You may not use this file except in compliance with the License. 734f9b3eeSRoland Mainz# 834f9b3eeSRoland Mainz# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 934f9b3eeSRoland Mainz# or http://www.opensolaris.org/os/licensing. 1034f9b3eeSRoland Mainz# See the License for the specific language governing permissions 1134f9b3eeSRoland Mainz# and limitations under the License. 1234f9b3eeSRoland Mainz# 1334f9b3eeSRoland Mainz# When distributing Covered Code, include this CDDL HEADER in each 1434f9b3eeSRoland Mainz# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1534f9b3eeSRoland Mainz# If applicable, add the following below this CDDL HEADER, with the 1634f9b3eeSRoland Mainz# fields enclosed by brackets "[]" replaced with your own identifying 1734f9b3eeSRoland Mainz# information: Portions Copyright [yyyy] [name of copyright owner] 1834f9b3eeSRoland Mainz# 1934f9b3eeSRoland Mainz# CDDL HEADER END 2034f9b3eeSRoland Mainz# 2134f9b3eeSRoland Mainz 2234f9b3eeSRoland Mainz# 233e14f97fSRoger A. Faulkner# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. 2434f9b3eeSRoland Mainz# 2534f9b3eeSRoland Mainz 2634f9b3eeSRoland Mainz# 2734f9b3eeSRoland Mainz# This test checks whether arithmetric math correctly supports 2834f9b3eeSRoland Mainz# negative zero values 2934f9b3eeSRoland Mainz# 3034f9b3eeSRoland Mainz# This was reported as CR #6805795 ("[ku1] ksh93 does not differ between -0 and +0"): 3134f9b3eeSRoland Mainz# ------------ snip ------------ 3234f9b3eeSRoland Mainz# Original bug report was: 3334f9b3eeSRoland Mainz# ------ snip ------ 3434f9b3eeSRoland Mainz# Is there a reason why ksh93 does not display the negative sign for the 3534f9b3eeSRoland Mainz# value zero ? For example if I have use the C99 function "copysign" 3634f9b3eeSRoland Mainz# (copies absolute value of operant a and sign of operant b) I get this 3734f9b3eeSRoland Mainz# for { a=5, b=-0 }: 3834f9b3eeSRoland Mainz# -- snip -- 3934f9b3eeSRoland Mainz# $ ksh93 -c 'float x; (( x=copysign(5, -0) )) ; printf "%f\n" 4034f9b3eeSRoland Mainz# x' 4134f9b3eeSRoland Mainz# -5.000000 4234f9b3eeSRoland Mainz# -- snip -- 4334f9b3eeSRoland Mainz# Now if I swap operands a and b I get this result: 4434f9b3eeSRoland Mainz# -- snip -- 4534f9b3eeSRoland Mainz# $ ksh93 -c 'float x; (( x=copysign(0, -5) )) ; printf "%f\n" x' 4634f9b3eeSRoland Mainz# 0.000000 4734f9b3eeSRoland Mainz# -- snip -- 4834f9b3eeSRoland Mainz# AFAIK this result should be "-0.000000" ... or not ? 4934f9b3eeSRoland Mainz# BTW: Parsing of "-0" doesn't seem to work either, e.g. 5034f9b3eeSRoland Mainz# -- snip -- 5134f9b3eeSRoland Mainz# $ ksh93 -c 'float x a=-1 b=-0; (( x=copysign(a, b) )) ; printf "%f\n" 5234f9b3eeSRoland Mainz# x' 5334f9b3eeSRoland Mainz# 1.000000 5434f9b3eeSRoland Mainz# -- snip -- 5534f9b3eeSRoland Mainz# ... while AFAIK it should be "-1.000000" since the 2nd operand of 5634f9b3eeSRoland Mainz# "copysign" defines the sign of the result. 5734f9b3eeSRoland Mainz# ------ snip ------ 5834f9b3eeSRoland Mainz# ------------ snip ------------ 5934f9b3eeSRoland Mainz# 6034f9b3eeSRoland Mainz 6134f9b3eeSRoland Mainz# test setup 6234f9b3eeSRoland Mainzfunction err_exit 6334f9b3eeSRoland Mainz{ 6434f9b3eeSRoland Mainz print -u2 -n "\t" 6534f9b3eeSRoland Mainz print -u2 -r ${Command}[$1]: "${@:2}" 663e14f97fSRoger A. Faulkner (( Errors < 127 && Errors++ )) 6734f9b3eeSRoland Mainz} 6834f9b3eeSRoland Mainzalias err_exit='err_exit $LINENO' 6934f9b3eeSRoland Mainz 7034f9b3eeSRoland Mainzset -o nounset 7134f9b3eeSRoland MainzCommand=${0##*/} 7234f9b3eeSRoland Mainzinteger Errors=0 7334f9b3eeSRoland Mainz 7434f9b3eeSRoland Mainztypeset str 7534f9b3eeSRoland Mainz 7634f9b3eeSRoland Mainz# test 1: test "copysign()" using constant values 7734f9b3eeSRoland Mainzstr=$( 7834f9b3eeSRoland Mainz set -o errexit 7934f9b3eeSRoland Mainz 8034f9b3eeSRoland Mainz print -- $(( copysign(0, -5) )) 8134f9b3eeSRoland Mainz ) || err_exit "test failed." 8234f9b3eeSRoland Mainz[[ "${str}" == "-0" ]] || err_exit "Expected copysign(0, -5) == -0, got ${str}" 8334f9b3eeSRoland Mainz 8434f9b3eeSRoland Mainz 8534f9b3eeSRoland Mainz# test 2: Same as test 1 but using variables for the values 8634f9b3eeSRoland Mainzstr=$( 8734f9b3eeSRoland Mainz set -o errexit 8834f9b3eeSRoland Mainz 8934f9b3eeSRoland Mainz float a 9034f9b3eeSRoland Mainz float b 9134f9b3eeSRoland Mainz float c 92*b30d1939SAndy Fiddaman 9334f9b3eeSRoland Mainz a=0. 9434f9b3eeSRoland Mainz b=-5. 95*b30d1939SAndy Fiddaman 9634f9b3eeSRoland Mainz (( c=copysign(a, b) )) 9734f9b3eeSRoland Mainz 9834f9b3eeSRoland Mainz print -- "$c" 9934f9b3eeSRoland Mainz ) || err_exit "test failed." 10034f9b3eeSRoland Mainz[[ "${str}" == "-0" ]] || err_exit "Expected c == -0, got ${str}" 10134f9b3eeSRoland Mainz 10234f9b3eeSRoland Mainz 10334f9b3eeSRoland Mainz# test 3: test "signbit()" 10434f9b3eeSRoland Mainzstr=$( 10534f9b3eeSRoland Mainz set -o errexit 106*b30d1939SAndy Fiddaman 10734f9b3eeSRoland Mainz float a 108*b30d1939SAndy Fiddaman 10934f9b3eeSRoland Mainz a=-0. 110*b30d1939SAndy Fiddaman 11134f9b3eeSRoland Mainz print -- $(( signbit(a) )) 11234f9b3eeSRoland Mainz ) || err_exit "test failed." 11334f9b3eeSRoland Mainz[[ "${str}" == "1" ]] || err_exit "Expected signbit(a, b) == 1, got ${str}" 11434f9b3eeSRoland Mainz 11534f9b3eeSRoland Mainz 11634f9b3eeSRoland Mainz# test 4: test "signbit()" 11734f9b3eeSRoland Mainzstr=$( 11834f9b3eeSRoland Mainz set -o errexit 119*b30d1939SAndy Fiddaman 12034f9b3eeSRoland Mainz float a 12134f9b3eeSRoland Mainz float c 122*b30d1939SAndy Fiddaman 12334f9b3eeSRoland Mainz a=-0. 124*b30d1939SAndy Fiddaman 12534f9b3eeSRoland Mainz (( c=signbit(a) )) 12634f9b3eeSRoland Mainz 12734f9b3eeSRoland Mainz print -- "$c" 12834f9b3eeSRoland Mainz ) || err_exit "test failed." 12934f9b3eeSRoland Mainz[[ "${str}" == "1" ]] || err_exit "Expected c == 1, got ${str}" 13034f9b3eeSRoland Mainz 13134f9b3eeSRoland Mainz 13234f9b3eeSRoland Mainz# test 5: test whether "typeset -X" (C99 "hexfloat") correctly recognizes 13334f9b3eeSRoland Mainz# negative zero assigned from a "float" 13434f9b3eeSRoland Mainzstr=$( 13534f9b3eeSRoland Mainz set -o errexit 136*b30d1939SAndy Fiddaman 13734f9b3eeSRoland Mainz float a # float 13834f9b3eeSRoland Mainz typeset -X c # hexfloat 139*b30d1939SAndy Fiddaman 14034f9b3eeSRoland Mainz a=-0. 141*b30d1939SAndy Fiddaman 14234f9b3eeSRoland Mainz # copy value from "float" to "hexfloat" 14334f9b3eeSRoland Mainz (( c=a )) 144*b30d1939SAndy Fiddaman 14534f9b3eeSRoland Mainz print -- "$c" 14634f9b3eeSRoland Mainz ) || err_exit "test failed." 14734f9b3eeSRoland Mainz[[ "${str}" == -0x* ]] || err_exit "Expected c == -0x*, got ${str}" 14834f9b3eeSRoland Mainz 14934f9b3eeSRoland Mainz 15034f9b3eeSRoland Mainz# test 6: Reverse of test 5: Test whether "float" correctly recognizes 15134f9b3eeSRoland Mainz# a C99 "hexfloat" value 15234f9b3eeSRoland Mainzstr=$( 15334f9b3eeSRoland Mainz set -o errexit 154*b30d1939SAndy Fiddaman 15534f9b3eeSRoland Mainz typeset -X a # hexfloat 15634f9b3eeSRoland Mainz float c # float 157*b30d1939SAndy Fiddaman 15834f9b3eeSRoland Mainz a=-0x0.0000000000000000000000000000p+00 159*b30d1939SAndy Fiddaman 16034f9b3eeSRoland Mainz # copy value from "hexfloat" to "float" 16134f9b3eeSRoland Mainz (( c=a )) 162*b30d1939SAndy Fiddaman 16334f9b3eeSRoland Mainz print -- "$c" 16434f9b3eeSRoland Mainz ) || err_exit "test failed." 16534f9b3eeSRoland Mainz[[ "${str}" == "-0" ]] || err_exit "Expected c == -0, got ${str}" 16634f9b3eeSRoland Mainz 16734f9b3eeSRoland Mainz 16834f9b3eeSRoland Mainz# tests done 16934f9b3eeSRoland Mainzexit $((Errors)) 170