Sponsored Content
Operating Systems OS X (Apple) A fixed point basic calculator for DASH. Post 303025523 by wisecracker on Monday 5th of November 2018 03:24:41 AM
Old 11-05-2018
A fixed point basic calculator for DASH.

This exercise has taught me a lot about POSIX, dash and their limits.

I decided to experiment with fixed point arithmetic using dash as the shell.
If you want to test it then change the shebang to your directory where 'dash' is or use 'bash' instead.

This was one of the hardest things I have done and it took me around 24 hours to just get addition and subtraction working with an accuracy of nine decimal places for calculation results inside + or - 1,000,000.000000000 and around 5 decimal places for the working limits of 64 bit integer maths of + or - 9223,372,036.85477[????].
I haven't done multiplication and division yet but have checked from the command line that these work and are easy enough now that I have this building block.
It will have bugs and limitations but for small scale quick fixed point calculations this seems to work fine at the moment.
As I once uploaded here, "Is there anything the UNIX shell can't do?" and the script is not that big.

This requires NO external command help to work, it is pure dash shell coding.
I will be finishing the multiplication and division whilst away next week.
Code:
#!/usr/local/bin/dash
#
#!/bin/bash
#
# 'calc' - A basic calculator for average sized numbers.
#
# OSX 10.13.6, default bash terminal.
# Another exercise in futility by B.Walker.
# Public Domain.
# Accurate enough to nine decimal places.
# USAGE: calc NUMBER1 +|-|*|/ NUMBER2
#
# In 64 bit mode.
# Total upper limit = +9223372036.85477; 64 bit signed integer = 9223372036854775807.
# Total lower limit = -9223372036.85477; 64 bit signed integer = 9223372036854775808.
# This allows nine places for the decimal component.

# Numerical variables.
NUM1="$1"
NUM2="$3"
# Equalise the decimal places.
FP1=$( printf "%.9f" "$NUM1" )
FP2=$( printf "%.9f" "$NUM2" )

# Calculation mode variable, limited error correction.
CALC="$2"
if [ "$NUM1" = "" ] || [ "$NUM2" = "" ] || [ "$CALC" = "" ]
then
	echo "USAGE: calc NUMBER1 +|-|*|/ NUMBER2"
	exit 1
fi

# Remove the decimal point(s).
INT1="${FP1%.*}${FP1#*.}"
INT2="${FP2%.*}${FP2#*.}"
# Remove all leading zeros.
INT1=$( printf "%.f" "$INT1" )
INT2=$( printf "%.f" "$INT2" )

# Addition and subtraction.
if [ "$CALC" = "+" ] || [ "$CALC" = "-" ]
then
	if [ "$CALC" = "+" ]
	then
		SUM=$(( (INT1)+(INT2) ))
	fi
	if [ "$CALC" = "-" ]
	then
		SUM=$(( (INT1)-(INT2) ))
	fi
	# Internal Variables.
	LENGTH="${#SUM}"
	MINUS="$SUM"
	FLOAT=""
	COUNT="0"

	# Detect the minus sign, save and delete.
	while [ "$COUNT" -le "$LENGTH" ]
	do
		MINUS="${MINUS%?}"
		if [ "$MINUS" = "-" ]
		then
			SUM="${SUM#?}"
			MINUS="-"
			break
		fi
		COUNT=$(( COUNT+1 ))
	done

	# Give a positive sign on the final result if it is not negative.
	# This condition can be removed if required.
	if [ "$MINUS" = "" ]
	then
		MINUS="+"
	fi

	# Pad a float result of less that 1.0 with leading zeros if required.
	LENGTH=${#SUM}
	if [ "$LENGTH" -le "9" ]
	then
		FLOAT=$( printf "%09d" "$SUM" )
		SUM="$FLOAT"
	fi

	# Obtain the integer part.
	INT="${SUM%?????????}"
	if [ "$INT" = "" ]
	then
		INT="0"
	fi

	# Obtain the float part.
	if [ "$LENGTH" -ge "10" ]
	then
		COUNT="10"
		GETFLOAT=""
		while [ "$COUNT" -le "$LENGTH" ]
		do
			GETFLOAT="$GETFLOAT"'?'
			COUNT=$(( COUNT+1 ))
		done
		FLOAT="${SUM#${GETFLOAT}}"
	fi
	RESULT="${INT}.${FLOAT}"
	printf "%s%.9f\n" "$MINUS" "$RESULT"
fi

# Multiplication.
if [ "$CALC" = "*" ]
then
	:
fi

# Division.
if [ "$CALC" = "/" ]
then
	:
fi

A couple of 'additions' using python 2.7 as a check.
OSX 10.13.6, default bash terminal calling /usr/local/bin/dash
Code:
Last login: Mon Nov  5 08:06:19 on ttys000
AMIGA:amiga~> cd Desktop/Code/Shell
AMIGA:amiga~/Desktop/Code/Shell> ./calc 1234567.987654321 - -1234567.135790864
+2469135.123445185
AMIGA:amiga~/Desktop/Code/Shell> python
Python 2.7.10 (default, Oct  6 2017, 22:29:07) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 1234567.987654321 - -1234567.135790864
2469135.123445185
>>> exit()
AMIGA:amiga~/Desktop/Code/Shell> ./calc 0.00001234567890 - 1.012401299
-1.012388953
AMIGA:amiga~/Desktop/Code/Shell> python
Python 2.7.10 (default, Oct  6 2017, 22:29:07) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.00001234567890 - 1.012401299
-1.0123889533211
>>> exit()
AMIGA:amiga~/Desktop/Code/Shell> _

Have fun and enjoy...
This is my pet love, getting languages to do something they were not designed to do.

Bazza.
These 2 Users Gave Thanks to wisecracker For This Post:
 

7 More Discussions You Might Find Interesting

1. UNIX for Advanced & Expert Users

Fibre connection Point to Point SUN

Anyone know of a guide or instructions for Solaris I got to configure a SBUS HBA to talk to a tape robot. I have done this on a switch but not point to point. just going HBA >>>>> TAPE Fibre simple two nodes Kie (6 Replies)
Discussion started by: kie
6 Replies

2. UNIX for Dummies Questions & Answers

dash after ampersant

Hi! I'm new in these forums and more or less new with Unix. So... here is the question: does anyone know where is redirected the output of a command when you put >&- after it? Does it means any standard file descriptor? Thanks! (2 Replies)
Discussion started by: csecnarf
2 Replies

3. Shell Programming and Scripting

How to perform a hexdump using dd from start point to end point?

hi, I would like to ask or is it possible to dump a hex using dd from starting point to end point just like the "xxd -s 512 -l 512 <bin file>" I know the redirect hexdump -C but i can't figure it out the combination options of dd. Hope someone can share their knowledge.. Thanks in... (3 Replies)
Discussion started by: jao_madn
3 Replies

4. Post Here to Contact Site Administrators and Moderators

How to sum up data in fixed width file with decimal point?

HI Everyone, I have below source file AAA|NAME1|ADDRESS1|300.20 BBB|NAME2|ADDRESS2|400.31 CCC|NAME3|ADDRESS3|300.34 I have requirement where I need to sum up fourth field in above fixed width pipe delimited flat file. When I use below code, it gives me value 1001.00 But I am expecting... (1 Reply)
Discussion started by: patricjemmy6
1 Replies

5. Shell Programming and Scripting

Fixed mount point for a USB cardreader (Raspberry Pi, UDEV)

Hey all! :) I'm trying to create a fixed mount point for an usb cardreader. I've found a script on a raspberry pi forum which does the following: usb stick is plugged in -> script checks the mount point for data -> script starts copying the files automatically -> script unmounts the... (0 Replies)
Discussion started by: Eomer
0 Replies

6. UNIX for Beginners Questions & Answers

How to create a new mount point with 600GB and add 350 GBexisting mount point? IN AIX

How to create a new mount point with 600GB and add 350 GBexisting mount point Best if there step that i can follow or execute before i mount or add diskspace IN AIX Thanks (2 Replies)
Discussion started by: Thilagarajan
2 Replies

7. Shell Programming and Scripting

A dash to GOTO or a dash from GOTO, that is the question...

Well, guys I saw a question about GOTO for Python. So this gave me the inspiration to attempt a GOTO function for 'dash', (bash and ksh too). Machine: MBP OSX 10.14.3, default bash terminal, calling '#!/usr/local/bin/dash'... This is purely a fun project to see if it is possible in PURE... (3 Replies)
Discussion started by: wisecracker
3 Replies
All times are GMT -4. The time now is 03:14 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy