Sponsored Content
Operating Systems OS X (Apple) Gobsmacked by ksh93 floating point arithmetic. Post 303024872 by Corona688 on Thursday 18th of October 2018 12:32:38 PM
Old 10-18-2018
Interesting, a few obvious improvements.
  • You don't need $ on variable names inside (( ))
  • (( )) replaces [ ] for integer mathematics, especially float
  • The && construct will tremendously reduce redundancy here
  • You should use typeset to declare a local variable, otherwise you're unintentionally stomping on each other's ANGLE all the time
  • You should not be using global variables for all communication
  • You can make that giant equation one short loop
  • Not everything needs to be a function, many things are shorter and more readable as the single value they are
  • A bit more sanitization for negative input values

Code:
#!/bin/ksh

e=2.71828182845904523
PI=3.14159265358979323

TORADIANS=$(( PI/180.0 )) # Correction for degrees to radians
TODEGREES=$(( 180.0/PI )) # Correction for radians to degrees

# SIN fixed to 8 decimal places.
Sin()
{
        typeset ANGLE var # Tell KSH ANGLE is local
        typeset SIN var # Also local

        ANGLE="$1"
        SIN=0.0

        while (( ANGLE < 0.0 ))
        do
                (( ANGLE += 360 ))
        done

        while (( ANGLE >= 360.0 )) # Too bad KSH doesn't have fmod
        do
                (( ANGLE -= 360.0 ))
        done

        (( ANGLE > 270.0 )) && (( ANGLE -= 360 ))
        (( ANGLE > 180.0 )) && ANGLE=$((-(ANGLE-180)))
        (( ANGLE > 90.0  )) && ANGLE=$(( 180 - ANGLE ))

        (( ANGLE *= TORADIANS ))  # Convert to radians

        # Series coefficients, for the sum of A to the $1 divided by $2 for each pair
        # Sets $1=1, $2=1.0, $3=3, $4=-6.0, etc
        set --  1       1.0             \
                3       -6.0            \
                5       120.0           \
                7       -5040.0         \
                9       362880.0        \
                11      -39916800       \
                13      6227020800.0

        while [ "$#" -gt 0 ]
        do
                # We DO need $ here since $1, $2, etc are special
                (( SIN += (ANGLE**$1)/$2 ))
                shift 2 # Discard the first two arguments
        done

        printf "%.8f\n" "$SIN"
}

# Test degrees.
for x in $( seq 0.0 15.0 360.0 )
do
        printf "%d\t" $x
        Sin $x
done


Last edited by Corona688; 10-18-2018 at 01:43 PM..
This User Gave Thanks to Corona688 For This Post:
 

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 06:41 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy