Adding good multiplication function
This commit is contained in:
parent
afcb66f6bd
commit
a6f3ace74e
1 changed files with 74 additions and 3 deletions
|
@ -1,6 +1,7 @@
|
||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
from unittest import result
|
||||||
import numpy
|
import numpy
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
@ -163,13 +164,83 @@ def greater_than(arg1_integer_part: str, arg2_integer_part: str, arg1_decimal_pa
|
||||||
|
|
||||||
|
|
||||||
def sb_multiply(arg1: str, arg2: str) -> bool:
|
def sb_multiply(arg1: str, arg2: str) -> bool:
|
||||||
pass
|
# 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__':
|
if __name__=='__main__':
|
||||||
print("add", sb_addition("-10", "-1.99999993") )
|
#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( type(sb_substract("9999999.019999", "99999.99999993")) )
|
||||||
print("sub", sb_substract("12", "78.9999") )
|
#print("sub", sb_substract("12", "78.9999") )
|
||||||
#print(greater_than("0","1110", "0","1112", True, True))
|
#print(greater_than("0","1110", "0","1112", True, True))
|
||||||
#print(greater_than("0","0", "1110","1112"))
|
#print(greater_than("0","0", "1110","1112"))
|
||||||
#print(greater_than('9001','9003'))
|
#print(greater_than('9001','9003'))
|
||||||
|
print("mul", sb_multiply('123','123.0'))
|
||||||
pass
|
pass
|
Loading…
Reference in a new issue