Sponsored Content
Operating Systems OS X (Apple) Gobsmacked by ksh93 floating point arithmetic. Post 303024735 by bakunin on Tuesday 16th of October 2018 05:03:01 AM
Old 10-16-2018
Quote:
Originally Posted by wisecracker
I am working on limited basic set of maths routines for ksh93 that can be sourced as . ./ksh_math.sh
Notice that the Korn shell doesn't need that: There is a variable FPATH, which works quite like PATH, but for functions: You set it to a (list of) directory/ies and every function not yet defined will be searched there. It is possible to build "libraries" that way by collecting functions into a certain directory.

In fact i use this feature heavily in my scripts. Here is my "standard script template":

Code:
#! /bin/ksh
# ------------------------------------------------------------------------------
# script-template                                       template for scripts
# ------------------------------------------------------------------------------
# Author.....: 
# last update: 2000 00 00    by: 
# ------------------------------------------------------------------------------
# Revision Log:
# - 0.xx   2000 00 00   Original Creation
#                       - <keyword here>
#
# ------------------------------------------------------------------------------
# Usage:
#
#
#     Example:
#
# Prerequisites:
#
# ------------------------------------------------------------------------------
# Documentation:
#
#     Parameters:
#     returns:
# ------------------------------------------------------------------------------
# known bugs:
#
#     none
# ------------------------------------------------------------------------------
# ................................(C) 2000 ... .................................
# ------------------------------------------------------------------------------

if [ -z "$DEVELOP" ] ; then                      # set environment
     . /usr/local/lib/ksh/f_env
else
     . ~/lib/f_env
fi

                                                 # local variables
typeset chUsageShort="usage: $0 [-(?|h)] | [-V] [-S]"

typeset achUsageLong[0]="$chUsageShort"
typeset achUsageLong[1]=" "
typeset achUsageLong[2]="Where         means"
typeset achUsageLong[3]="   -?|h[elp]  display this help"
typeset achUsageLong[4]="   -V         verbose, fulldebug mode"
typeset achUsageLong[5]="   -S         simulation mode, cmds only displayed"

typeset    chProgBase="${chProgName##*/}"        # ^= basename $0

typeset    chOpt=""


while getopts ":hVS" chOpt ; do                    # process commandline
     case "$chOpt" in
          h)                                       # display help
               f_usage full
               ;;

          "?")
               if [ "$chOpt" == "?" -a "$OPTARG" == "?" ] ; then
                    f_usage full
               else
                    f_die 1 "unknown option -${OPTARG}"
               fi
               ;;

          V)                                     # fulldebug mode
               export chFullDebug='set -xv'
               ;;

          S)                                     # simulation mode
               SIMULATE='print -'
               ;;

     esac
done

<your code here>
# -- EOF template.sh

where f_usage and f_env are functions in this library. Here is f_env:

Code:
# ------------------------------------------------------------------------------
# f_env()                                set the environment to a defined state
# ------------------------------------------------------------------------------
# Author.....: Wolf Machowitsch
# last update: 2001 08 08    by: Wolf Machowitsch
# ------------------------------------------------------------------------------
# Revision Log:
# - 0.99   1999 01 21   Original Creation
#                       -
#
# - 1.00   1999 03 12   Production release
#                       Reviewed version. chFullDebug can now be set via
#                       the commandline outside the script too. However,
#                       in this case the value of $chFullDebug is not
#                       checked for validity.
#                       -
#
# - 1.01   1999 04 18   Developers switch
#                       f_env now scans the environment for a variable
#                       $DEVELOP. If it is non-null, then FPATH is not
#                       set to "/usr/local/lib/ksh" but to "~/lib".
#                       This way it is possible to test new developments
#                       for the library before migrating them to the
#                       production environment.
#
# - 1.10   1999 05 01   bugfix version: system environment used
#                       /etc/environment is now parsed in in f_env().
#                       Not to do this would leave variables like ODMDIR
#                       unset. Some AIX processes rely on this.
#
# - 1.20   1999 05 10   Log- and Error-file
#                       support added for error- and logfile as used in
#                       the f_Cmd*-functions.
#
# - 1.30   2000 03 07   User- and Host-information
#                       to support the automated mailing facility some
#                       info about effective UID, hostname, etc. is
#                       retrieved.
#
#
# - 1.40   2001 05 23   Linux ready
#                       the 'uname' command is now used to find out the
#                       OS we're running. Accordingly either /etc/profile
#                       or /etc/environment is sourced in and a variable
#                       is set.
#
# - 1.41   2001 08 08   bugfix
#                       since in Linux '/bin' is not a link to '/usr/bin'
#                       (like in AIX) '/bin' is now included in the path.
#
# - 1.50   2015 09 24   HMC-List
#                       added a list of known HMCs to use for f_GetHostList()
#
# ------------------------------------------------------------------------------
# Usage:
#     f_env() is to be PARSED into the scripts environment. The following
#     piece of code shows how to use it.
#
#     Example:
#     #!/bin/ksh
#     # example script for using f_env()
#     . /usr/local/lib/ksh/f_env
#     # ---- here goes the rest of your code -----
#     exit
#
# Prerequisites:
# ------------------------------------------------------------------------------
# Documentation:
#     f_env() is intended to be used at the beginning of scripts to make
#     the environment always the same for every script instead of being
#     dependant of the environment the developer has set in his shell.
#     To use this script it has to be PARSED rather than called as a
#     function.
#
#     Parameters: void
#     returns:    void
# ------------------------------------------------------------------------------
# known bugs:
#
#     none
# ------------------------------------------------------------------------------
# ......................(C) 99 Wolf Machowitsch ................................
# ------------------------------------------------------------------------------

if [ -z "$NEVER_USE_THIS_VAR" ] ; then           # are we called recursively ?

     unset ENV                                   # clear the environment

     #---------------------------------------------------- set basic environment

     typeset -x OS=$(uname -a | cut -d' ' -f1)   # find out the OS
                                                 # read in standard environment
     case "$OS" in
          AIX)
               . /etc/environment
               ;;

          Linux)
               . /etc/profile
               ;;

          *)
               . /etc/environment
               ;;
     esac

                                                 # set default TERM variable
     case "$OS" in
          AIX)
               TERMDEF="$(termdef)"
               ;;

          Linux)
               TERMDEF="$TERM"
               ;;

          *)
               TERMDEF="$TERM"
               ;;

     esac
     typeset -x TERM=${TERMDEF:-'wyse60'}        # set default TERM variable

     typeset -x LANG=C                           # default language environment
     typeset -x EDITOR=vi                        # what else ? ;-))
     typeset -x VISUAL=$EDITOR

     typeset -x PATH="/usr/bin"                  # set the path
                PATH="$PATH:/bin"
                PATH="$PATH:/etc"
                PATH="$PATH:/usr/sbin"
                PATH="$PATH:/usr/ucb"
                PATH="$PATH:/sbin"
                PATH="$PATH:/usr/bin/X11"
                PATH="$PATH:/usr/local/bin"      # tools, home for scripts
                PATH="$PATH:/usr/local/sbin"     # -"-

     typeset -x chTmpDir=""                      # path for temporary files

     #---------------------------------------------------- debugging stuff
     if [ -z "$chFullDebug" ] ; then             # debug switch
          typeset -x chFullDebug=""
     else
          typeset -x chFullDebug                 # export if already set
     fi
     typeset -x SIMULATE=''                      # set to 'print' for
                                                 # simulation mode
     typeset -x TRACE=''                         # set to 'on' for trace mode

     if [ -z "$DEVELOP" ] ; then
          typeset -x FPATH="/usr/local/lib/ksh"  # set fnc path for fnc lib
          FPATH="$FPATH:/usr/local/bin"
          FPATH="$FPATH:/usr/local/sbin"
     else
          typeset -x FPATH=~/lib        # for lib development
     fi

     #---------------------------------------------------- global constants
     typeset -x chProgName="$0"                  # const. for main program name

     typeset -x chUsageShort=""                  # short usage message
     typeset -x achUsageLong[0]=""               # long usage message (line)

     if [ -z "$fLogFile" ] ; then                # log file
          if [ $(f_ImRoot ; print $?) -eq 0 ] ; then
               typeset -x fLogFile='/usr/local/log/system.log'
          else
               typeset -x fLogFile=~/system.log
          fi
     else
          typeset -x fLogFile
     fi
     if [ -z "$fErrFile" ] ; then                # error file
          if [ $(f_ImRoot ; print $?) -eq 0 ] ; then
               typeset -x fErrFile='/usr/local/log/system.err'
          else
               typeset -x fErrFile=~/system.err
          fi
     else
          typeset -x fErrFile
     fi

     #---------------------------------------------------- automated mail
     typeset -x chUser=$(id -nur)

     #-------------------------------------------------- site dependent includes

                                                 # HP Open View at xxx
     typeset -x AlertSW='OV'                     # alerting software
     typeset -x AlertCmd='/usr/lpp/OV/bin/opcmsg' # for f_Alert()
     typeset -x AlertApp=''                      # are defined in the script
     typeset -x AlertObj=''

                                                 # HMC list for xxx
     typeset -x CachHMC[1]="xxx-f-hmc1"
     typeset -x CachHMC[2]="xxx-f-hmc2"
     typeset -x CachHMC[3]="xxx-f-hmc3"
     typeset -x CachHMC[4]="xxx-f-hmc4"

     #-------------------------------------------------- reentrancy protection
     typeset -x NEVER_USE_THIS_VAR="KILROY_WAS_HERE"
fi

# --- EOF f_env

Notice that there is a variable "DEVELOP": set it to any value and the script will use not the library in /usr/local/lib/ksh but the one in ~/lib. This way you can have a personal copy of the lib and tinker with it without affecting other scripts using the same functions. Also notice that i have some logging functions which all write to a continuous log defined here (/usr/local/log/system.log and /usr/local/log/system.err).

If you are interested i can eventually publish more functions from my library.

@Corona: ksh93 is a widely used shell. In every AIX version since 5L it is included (as ksh93) and in most Linux distributions it is part of the installable base. AIX uses a ksh88 (as ksh and as sh) as the default shell since AIX 4 (about 1997).

I hope this helps.

bakunin

Last edited by bakunin; 10-16-2018 at 12:04 PM..
This User Gave Thanks to bakunin 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 03:08 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy