division calculates a wrong value
1 visualización (últimos 30 días)
Mostrar comentarios más antiguos
I have this Market class which adjusts the price of two cryptocurrencies. This method allows you to buy the first cryptocurrency by selling the second.
tokenBobtained = abs(obj.supplyB - (obj.k / obj.supplyA));
disp(tokenBobtained) % print 182
obj.supplyB = obj.k / obj.supplyA;
obj.priceB = (transactionVolume * obj.priceA) / tokenBobtained; % ERROR!
tokenBobtained in the example is 182, but in the last line the result of obj.priceB is not the one hoped for.
obj.priceB in the end of execution is 1 but it should be 0.55. The cool thing is that if I replace 182 with "tokenBobtained" in the last line I get 0.55, but in this way it doesn't work! What's the problem?
3 comentarios
Walter Roberson
el 24 de Mayo de 2023
Are any of the fields involved integer data type, such as uint16 ?
Francesco Pio
el 24 de Mayo de 2023
Movida: Walter Roberson
el 24 de Mayo de 2023
Respuestas (1)
Walter Roberson
el 24 de Mayo de 2023
Movida: Walter Roberson
el 24 de Mayo de 2023
initialSupply (1,1) uint64 {mustBePositive} = 1
Operations on uint64 return uint64.
Division with integer datatypes round before conversion to integer data type.
2 comentarios
Steven Lord
el 24 de Mayo de 2023
The k property of the Market class is uint64 and that gets used in the originally posted code.
You could convert those integer values to double before dividing with / or you could use the idivide function, which lets you control how the result is rounded. Though idivide does not allow you to perform the division between a double and a 64-bit integer so unless you need to allow values of k outside the range of a 32-bit integer I'd store that property as a uint32.
Ver también
Categorías
Más información sobre Fuzzy Inference System Modeling en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!