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