Sponsored Content
Operating Systems OS X (Apple) Gobsmacked by ksh93 floating point arithmetic. Post 303024868 by wisecracker on Thursday 18th of October 2018 11:34:50 AM
Old 10-18-2018
Well this exercise in futility is coming along.

@bakunin
I like the template idea and will use it when I am happy with the results.

@all the viewers

In the code are two attempts at creating SINE(X).
The first uses ANGLE in degrees and this is my choice at the moment because:
1: The results are consistent to 8 decimal places to the Google calculator values. (NOTE: printf rounds at the 8th decimal place.)
2: Number 1: gives the correct result irrespective of ANGLEs greater than 360 degrees.
However...
3: The RADIAN method is good enough for the first quadrant but creeping errors start to begin beyond that due to PRECISION and rounding.
4: For RADIAN values greater than 2*PI these creeping errors become large and when greater than 6*PI even 5 decimal places is not good enough.
The RADIAN version is commented out along with test code so experimenters can see these anomalies for themselves.
Code:
# SINE(angle) in degrees.
# Called as:
# Sin ANGLE
# Where ANGLE is any positive floating point value.
# Returns SIN as a variable to 8 decimal places.
# Google sin(degrees) values for first quadrant.
#
# 0	0.00000000000
# 15	0.25881904510
# 30	0.50000000000
# 45	0.70710678118
# 60	0.86602540378
# 75	0.96592582628
# 90	1.00000000000
Sin()
{
	# SIN fixed to 8 decimal places.
	ANGLE=$1
	while [ $ANGLE -gt 360.0 ]
	do
		ANGLE=$(( $ANGLE-360.0 ))
	done
	if [ $ANGLE -ge 360.0 ]
	then
		ANGLE=0.0
	fi
	if [ $ANGLE -gt 270.0 ]
	then
		ANGLE=$(( $ANGLE-360.0 ))
	fi
	if [ $ANGLE -gt 180.0 ]
	then
		ANGLE=$(( -($ANGLE-180.0) ))
	fi
	if [ $ANGLE -gt 90.0 ]
	then
		ANGLE=$(( 180.0-$ANGLE ))
	fi
	Radian $ANGLE
	SIN=$(( $RADIAN-(($RADIAN**3)/6.0)+(($RADIAN**5)/120.0)-(($RADIAN**7)/5040.0)+(($RADIAN**9)/362880.0)-(($RADIAN**11)/39916800.0)+(($RADIAN**13)/6227020800.0) ))
	SIN=$( printf "%.8f" "$SIN" )
}

#Sin(radians).
#{
#	RADIAN=$1
#	while [ $RADIAN -gt $(( 2*$PI )) ]
#	do
#		RADIAN=$(( $RADIAN-2*$PI ))
#	done
#	if [ $RADIAN -ge $(( 2*$PI )) ]
#	then
#		RADIAN=0.0
#	fi
#	if [ $RADIAN -gt $(( (3*PI)/4 )) ]
#	then
#		RADIAN=$(( $RADIAN-2*PI ))
#	fi
#	if [ $RADIAN -gt $PI ]
#	then
#		RADIAN=$(( -($RADIAN-$PI) ))
#	fi
#	if [ $RADIAN -gt $(( $PI/2 )) ]
#	then
#		RADIAN=$(( $PI-$RADIAN ))
#	fi
#	SIN=$(( $RADIAN-(($RADIAN**3)/6.0)+(($RADIAN**5)/120.0)-(($RADIAN**7)/5040.0)+(($RADIAN**9)/362880.0)-(($RADIAN**11)/39916800.0)+(($RADIAN**13)/6227020800.0) ))
#}


# COSINE(x)
# Called as:
# Cos RADIANS
# Returns COS as a variable.
Cos()
{
	:
}

# ANGLE to RADIAN.
# Called as:
# Radian ANGLE
# Returns RADIAN as a variable.
Radian()
{
	ANGLE=$1
	RADIAN=$(( ($ANGLE*$PI)/180.0 ))
}

# RADIAN to ANGLE.
# Called as:
# Angle RADIAN
# Returns ANGLE as a variable.
Angle()
{
	RADIAN=$1
	ANGLE=$(( ($RADIAN*180.0)/$PI ))
}

# **********************************
# Test radians.
#for x in $( seq 0 $(( $PI/12 )) $(( 6*PI )) )
#do
#	Sin x
#	printf "%u -> %.8f\n" "$x" "$SIN"
#done

# Test degrees.
for x in $( seq 0.0 15.0 360.0 )
do
	Sin x
	echo "$x -> $SIN"
done
# **********************************

Results, OSX 10.13.6, default bask terminal calling ksh.
Code:
Last login: Thu Oct 18 15:52:22 on ttys000
AMIGA:amiga~> cd Desktop/Code/Shell
AMIGA:amiga~/Desktop/Code/Shell> ./ksh_math.sh
0 -> 0.00000000
15 -> 0.25881905
30 -> 0.50000000
45 -> 0.70710678
60 -> 0.86602540
75 -> 0.96592583
90 -> 1.00000000
105 -> 0.96592583
120 -> 0.86602540
135 -> 0.70710678
150 -> 0.50000000
165 -> 0.25881905
180 -> 0.00000000
195 -> -0.25881905
210 -> -0.50000000
225 -> -0.70710678
240 -> -0.86602540
255 -> -0.96592583
270 -> -1.00000000
285 -> -0.96592583
300 -> -0.86602540
315 -> -0.70710678
330 -> -0.50000000
345 -> -0.25881905
360 -> 0.00000000
AMIGA:amiga~/Desktop/Code/Shell> _

Compare the angles with those from Google inside the code.
 

10 More Discussions You Might Find Interesting

1. Programming

floating point problem

Hi all! Hi all! I am working with a problem to find the smallest floating point number that can be represented. I am going in a loop ,stating with an initial value of 1.0 and then diving it by 10 each time thru the loop. So the first time I am getting o.1 which I wanted.But from the next... (4 Replies)
Discussion started by: vijlak
4 Replies

2. Shell Programming and Scripting

Rounding off the value of Floating point value

Hello, i have some variables say: x=1.4 y=3.7 I wish to round off these values to : x = 2 (after rounding off) y = 4 (after rounding off) I am stuck. Please help. (7 Replies)
Discussion started by: damansingh
7 Replies

3. Linux

Floating Point Exception

Hi, I am compiling "HelloWorld" C progam on 32-bit CentOS and i want to execute it on 64-bit CentOS architecture. For that i copied the a.out file from 32-bit to 64-bit machine, but while executing a.out file on 64bit machine I am getting "Floating point exception error". But we can run... (3 Replies)
Discussion started by: Mandar123
3 Replies

4. Programming

Floating point Emulator

what is floating point emulator(FPE)? where and why it is used? (1 Reply)
Discussion started by: pgmfourms
1 Replies

5. Shell Programming and Scripting

how to compare 2 floating point no.

Hi, Could any one tell me how to compare to floating point no. using test command. As -eq option works on only intergers. i=5.4 if then echo "equal" else echo "not equal" fi here output will be equal even though no. are unequal. Thanks, ravi (1 Reply)
Discussion started by: useless79
1 Replies

6. Shell Programming and Scripting

floating point numbers in if

# if > then > echo "1" > else > echo "2" > fi -bash: How can i compare floating point numbers inside statement? (15 Replies)
Discussion started by: proactiveaditya
15 Replies

7. Shell Programming and Scripting

Arithmetic in floating point

is it not possible to simply di aritmetic without using bc or awk i have tried folllowing operatrions but they support only integer types plz suggest me code for floating using values stored in the variables.the ans i get is integer and if i input floating values i get error numeric constant... (6 Replies)
Discussion started by: sumit the cool
6 Replies

8. Programming

Floating Point

Anyone help me i cant found the error of floating point if needed, i added the code complete #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> typedef struct { int hh; int mm; int ss; char nom; int punt; }cancion; typedef struct... (9 Replies)
Discussion started by: Slasho
9 Replies

9. Shell Programming and Scripting

floating point arithmetic operation error

I am writing a script in zsh shell, it fetchs a number from a file using the awk command, store it as a variable, which in my case is a small number 0.62000. I want to change this number by multiplying it by 1000 to become 620.0 using the command in the script var2=$((var1*1000)) trouble is... (2 Replies)
Discussion started by: piynik
2 Replies

10. Shell Programming and Scripting

BC calculation for floating (invalid arithmetic operator )

Hi, I wish to compare the CPU LOAD 1 min with 5mins and 15mins. If 1 min's CPU LOAd spike 3% compare to 5 mins or 15 mins CPU Load, it is warning. If 1 min's CPU LOAd spike 5% compare to 5 mins or 15 mins CPU Load, it is critical. However I received following code error, I google it and... (10 Replies)
Discussion started by: alvintiow
10 Replies
All times are GMT -4. The time now is 10:06 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy