compressionproject/CTPLICA/comproject.py
2022-03-26 17:05:01 +01:00

246 lines
No EOL
14 KiB
Python

#!/usr/bin/python3
import sys
from unittest import result
import numpy
import time
def sb_addition(arg1: str, arg2: str) -> str:
result = ''
# the addition will be a substraction if (arg1 is negative and arg2 is positive) or (arg1 is positive and arg2 is negative)
if str(arg1).startswith('-') and not(str(arg2).startswith('-')): # arg1 is negative and arg2 is positive
return sb_substract(str(arg2), str(arg1).replace('-',''))
elif not(str(arg1).startswith('-')) and str(arg2).startswith('-'): # arg1 is positive and arg2 is negative
return sb_substract(str(arg1), str(arg2).replace('-',''))
# transform arg1 to string if not already in string and test if it's a full integer (without decimal part or decimal part equals zero)
arg1_as_string = str(arg1)
arg1_integer_part = arg1_as_string
arg1_decimal_part = ''
arg1_is_full_integer = True
arg1_is_negative = True if arg1_integer_part.startswith('-') else False
try:
arg1_integer_part, arg1_decimal_part = arg1_as_string.split(".")
if arg1_decimal_part==len(arg1_decimal_part)*'0': arg1_is_full_integer = True
else: arg1_is_full_integer = False
except:
pass#nothing to do
if arg1_is_negative: arg1_integer_part = arg1_integer_part.replace('-', '')
# transform arg2 to string if not already in string and test if it's a full integer (without decimal part or decimal part equals zero)
arg2_as_string = str(arg2)
arg2_integer_part = arg2_as_string
arg2_decimal_part = ''
arg2_is_full_integer = True
arg2_is_negative = True if arg2_integer_part.startswith('-') else False
try:
arg2_integer_part, arg2_decimal_part = arg2_as_string.split(".")
if arg2_decimal_part==len(arg2_decimal_part)*'0': arg2_is_full_integer = True
else: arg2_is_full_integer = False
except:
pass#nothing to do
if arg2_is_negative: arg2_integer_part = arg2_integer_part.replace('-', '')
# making integer and decimal parts same size
max_integer_part_size = max( len(arg1_integer_part), len(arg2_integer_part) )
arg1_integer_part = '0'*(max_integer_part_size-len(arg1_integer_part)) + arg1_integer_part
arg2_integer_part = '0'*(max_integer_part_size-len(arg2_integer_part)) + arg2_integer_part
#---------
max_decimal_part_size = max(len(arg1_decimal_part),len(arg2_decimal_part))
arg1_decimal_part = arg1_decimal_part + '0'*(max_decimal_part_size-len(arg1_decimal_part))
arg2_decimal_part = arg2_decimal_part + '0'*(max_decimal_part_size-len(arg2_decimal_part))
# making real addition operation
# when here, it means both numbers are positives OR both numbers are negatives
rem = '0'
if not(arg1_is_full_integer) or not(arg2_is_full_integer):
for i in range(max_decimal_part_size-1, -1, -1):
res = int( eval('(' + arg1_decimal_part[i] + '+' + arg2_decimal_part[i] + '+' + str(rem) + ')%10') )
result = str(res) + result
rem = int( eval('((' + arg1_decimal_part[i] + '+' + arg2_decimal_part[i] + '+' + str(rem) + ') - ' + str(res) + ')/10') )
result = '.' + result
for i in range(max_integer_part_size-1, -1, -1):
res = int( eval('(' + arg1_integer_part[i] + '+' + arg2_integer_part[i] + '+' + str(rem) + ')%10') )
result = str(res) + result
rem = int( eval('((' + arg1_integer_part[i] + '+' + arg2_integer_part[i] + '+' + str(rem) + ') - ' + str(res) + ')/10') )
if str(rem) != '0': result = str(rem) + result
if arg1_is_negative and arg2_is_negative: result = '-' + result # treat the case both numbers are negative
while result.startswith('-0'): result = result.replace('-0','-')
if '.' in result and result.split('.')[1]==len(result.split('.')[1])*'0': return result.split('.')[0] # no need to return the result decimal part if it's equal to zero
return result
def sb_substract(arg1: str, arg2: str) -> str:
result = '' # will be arg1-arg2
# the substraction will be an addition if (arg1 is negative and arg2 is positive) or (arg1 is positive and arg2 is negative)
if str(arg1).startswith('-') and not(str(arg2).startswith('-')): # arg1 is negative and arg2 is positive
return sb_addition(str(arg1), '-'+str(arg2))
elif not(str(arg1).startswith('-')) and str(arg2).startswith('-'): # arg1 is positive and arg2 is negative
return sb_addition(str(arg1), str(arg2).replace('-',''))
# transform arg1 to string if not already in string and test if it's a full integer (without decimal part or decimal part equals zero)
arg1_as_string = str(arg1)
arg1_integer_part = arg1_as_string
arg1_decimal_part = ''
arg1_is_full_integer = True
arg1_is_negative = True if arg1_integer_part.startswith('-') else False
try:
arg1_integer_part, arg1_decimal_part = arg1_as_string.split(".")
if arg1_decimal_part==len(arg1_decimal_part)*'0': arg1_is_full_integer = True
else: arg1_is_full_integer = False
except:
pass#nothing to do
if arg1_is_negative: arg1_integer_part = arg1_integer_part.replace('-', '')
# transform arg2 to string if not already in string and test if it's a full integer (without decimal part or decimal part equals zero)
arg2_as_string = str(arg2)
arg2_integer_part = arg2_as_string
arg2_decimal_part = ''
arg2_is_full_integer = True
arg2_is_negative = True if arg2_integer_part.startswith('-') else False
try:
arg2_integer_part, arg2_decimal_part = arg2_as_string.split(".")
if arg2_decimal_part==len(arg2_decimal_part)*'0': arg2_is_full_integer = True
else: arg2_is_full_integer = False
except:
pass#nothing to do
if arg2_is_negative: arg2_integer_part = arg2_integer_part.replace('-', '')
# making integer and decimal parts same size
max_integer_part_size = max( len(arg1_integer_part), len(arg2_integer_part) )
arg1_integer_part = '0'*(max_integer_part_size-len(arg1_integer_part)) + arg1_integer_part
arg2_integer_part = '0'*(max_integer_part_size-len(arg2_integer_part)) + arg2_integer_part
#---------
max_decimal_part_size = max(len(arg1_decimal_part),len(arg2_decimal_part))
arg1_decimal_part = arg1_decimal_part + '0'*(max_decimal_part_size-len(arg1_decimal_part))
arg2_decimal_part = arg2_decimal_part + '0'*(max_decimal_part_size-len(arg2_decimal_part))
# making real substraction operation
# when here, it means both numbers are positives OR both numbers are negatives
result_needs_negative_sign_in_font = False
if arg1_is_negative and arg2_is_negative:
if greater_than(arg2_integer_part, arg1_integer_part, arg2_decimal_part, arg1_decimal_part):
temp = arg1_integer_part
arg1_integer_part = arg2_integer_part
arg2_integer_part = temp
#---------
temp = arg1_decimal_part
arg1_decimal_part = arg2_decimal_part
arg2_decimal_part = temp
else:
result_needs_negative_sign_in_font = True
elif not(arg1_is_negative) and not(arg2_is_negative):
if greater_than(arg1_integer_part, arg2_integer_part, arg1_decimal_part, arg2_decimal_part):
pass # nothing to do
else:
temp = arg1_integer_part
arg1_integer_part = arg2_integer_part
arg2_integer_part = temp
#---------
temp = arg1_decimal_part
arg1_decimal_part = arg2_decimal_part
arg2_decimal_part = temp
result_needs_negative_sign_in_font = True
rem = '0'
if not(arg1_is_full_integer) or not(arg2_is_full_integer):
for i in range(max_decimal_part_size-1, -1, -1):
upper_digit_to_consider = int( eval( arg1_decimal_part[i] + '+' + '10 if ' + arg1_decimal_part[i] + '<(' + arg2_decimal_part[i] + '+' + str(rem) + ') else ' + arg1_decimal_part[i] ) )
res = int( eval( str(upper_digit_to_consider) + '-(' + arg2_decimal_part[i] + '+' + str(rem) + ')' ) )
result = str(res) + result
rem = int( eval( '1 if ' + arg1_decimal_part[i] + '<(' + arg2_decimal_part[i] + '+' + str(rem) + ') else 0' ) )
result = '.' + result
for i in range(max_integer_part_size-1, -1, -1):
upper_digit_to_consider = int( eval( arg1_integer_part[i] + '+' + '10 if ' + arg1_integer_part[i] + '<(' + arg2_integer_part[i] + '+' + str(rem) + ') else ' + arg1_integer_part[i] ) )
res = int( eval( str(upper_digit_to_consider) + '-(' + arg2_integer_part[i] + '+' + str(rem) + ')' ) )
result = str(res) + result
rem = int( eval( '1 if ' + arg1_integer_part[i] + '<(' + arg2_integer_part[i] + '+' + str(rem) + ') else 0' ) )
if str(rem) != '0': result = str(rem) + result
if result_needs_negative_sign_in_font: result = '-' + result
while result.startswith('-0'): result = result.replace('-0','-')
if '.' in result and result.split('.')[1]==len(result.split('.')[1])*'0': return result.split('.')[0] # no need to return the result decimal part if it's equal to zero
return result
def greater_than(arg1_integer_part: str, arg2_integer_part: str, arg1_decimal_part: str='', arg2_decimal_part: str='') -> bool: # verify if arg1 >= arg2
# we assume integer parts are same size and decimal parts are also same size
assert len(arg1_integer_part)==len(arg2_integer_part) and len(arg1_decimal_part)==len(arg2_decimal_part)
for i in range(len(arg1_integer_part)):
if eval( arg1_integer_part[i] + '<' + arg2_integer_part[i] ): return False
for i in range(len(arg1_decimal_part)):
if eval( arg1_decimal_part[i] + '<' + arg2_decimal_part[i] ): return False
return True
def sb_multiply(arg1: str, arg2: str) -> bool:
# transform arg1 to string if not already in string and test if it's a full integer (without decimal part or decimal part equals zero)
arg1_as_string = str(arg1)
arg1_integer_part = arg1_as_string
arg1_decimal_part = ''
arg1_is_full_integer = True
arg1_is_negative = True if arg1_integer_part.startswith('-') else False
try:
arg1_integer_part, arg1_decimal_part = arg1_as_string.split(".")
if arg1_decimal_part==len(arg1_decimal_part)*'0': arg1_is_full_integer = True
else: arg1_is_full_integer = False
except:
pass#nothing to do
if arg1_is_negative: arg1_integer_part = arg1_integer_part.replace('-', '')
# transform arg2 to string if not already in string and test if it's a full integer (without decimal part or decimal part equals zero)
arg2_as_string = str(arg2)
arg2_integer_part = arg2_as_string
arg2_decimal_part = ''
arg2_is_full_integer = True
arg2_is_negative = True if arg2_integer_part.startswith('-') else False
try:
arg2_integer_part, arg2_decimal_part = arg2_as_string.split(".")
if arg2_decimal_part==len(arg2_decimal_part)*'0': arg2_is_full_integer = True
else: arg2_is_full_integer = False
except:
pass#nothing to do
if arg2_is_negative: arg2_integer_part = arg2_integer_part.replace('-', '')
# making integer and decimal parts same size
max_integer_part_size = max( len(arg1_integer_part), len(arg2_integer_part) )
arg1_integer_part = '0'*(max_integer_part_size-len(arg1_integer_part)) + arg1_integer_part
arg2_integer_part = '0'*(max_integer_part_size-len(arg2_integer_part)) + arg2_integer_part
#---------
max_decimal_part_size = max(len(arg1_decimal_part),len(arg2_decimal_part))
arg1_decimal_part = arg1_decimal_part + '0'*(max_decimal_part_size-len(arg1_decimal_part))
arg2_decimal_part = arg2_decimal_part + '0'*(max_decimal_part_size-len(arg2_decimal_part))
# making real multiplication operation
rem = '0'
intermediate_numbers = []
#down_number_in_multiplication = arg2_integer_part+arg2_decimal_part
#up_number_in_multiplication = arg1_integer_part+arg1_decimal_part
if arg2_is_full_integer:
down_number_in_multiplication = arg2_integer_part
else:
down_number_in_multiplication = arg2_integer_part+arg2_decimal_part
if arg1_is_full_integer:
up_number_in_multiplication = arg1_integer_part
else:
up_number_in_multiplication = arg1_integer_part+arg1_decimal_part
print("up_number_in_multiplication", up_number_in_multiplication)
print("down_number_in_multiplication", down_number_in_multiplication)
for j in range(len(down_number_in_multiplication)-1, -1, -1):
current_intermediate_number = '0'*( (len(down_number_in_multiplication)-1) - j )
for i in range(len(up_number_in_multiplication)-1, -1, -1):
res = int( eval( '((' + down_number_in_multiplication[j] + '*' + up_number_in_multiplication[i] + ')+' + str(rem) + ')%10' ) )
current_intermediate_number = str(res) + current_intermediate_number
rem = int( eval( '(((' + down_number_in_multiplication[j] + '*' + up_number_in_multiplication[i] + ')+' + str(rem) + ') - ' + str(res) + ')/10') )
if rem != '0': current_intermediate_number = str(rem) + current_intermediate_number
intermediate_numbers.append(current_intermediate_number)
result = intermediate_numbers[0]
for k in range(1, len(intermediate_numbers)):
result = sb_addition(result, intermediate_numbers[k])
print("result before putting . :", result)
if not(arg1_is_full_integer) or not(arg2_is_full_integer):
result = result[:-len(arg1_decimal_part+arg2_decimal_part)]+'.'+result[len(result)-len(arg1_decimal_part+arg2_decimal_part):] #here to modifiy
while result.startswith('0'): result = result[1:]
if (arg1_is_negative and not(arg2_is_negative)) or (not(arg1_is_negative) and arg2_is_negative): result = '-' + result
#print("result", result[:-len(arg1_decimal_part+arg2_decimal_part)]+'.'+result[len(result)-len(arg1_decimal_part+arg2_decimal_part):])
return result
if __name__=='__main__':
#print("add", sb_addition("2222222222222222222222222222222222222222.55", "2.55") )
#print("add", sb_addition("3.8257", "0.8257") )
#print( type(sb_substract("9999999.019999", "99999.99999993")) )
#print("sub", sb_substract("12", "78.9999") )
#print(greater_than("0","1110", "0","1112", True, True))
#print(greater_than("0","0", "1110","1112"))
#print(greater_than('9001','9003'))
print("mul", sb_multiply('123','123.0'))
pass