ArithmeticError on big numbers?

So I was just writing an answer to this question and then I checked

given:

defmodule Pow do
  def powa(x, n), do: powa(x, n, 1) 
  def powa(_, 0, acc), do: acc
  def powa(x, n, acc), do: powa(x, n-1, acc * x)
end

Pow.powa(phi, 1000) gives 3.2735165627676025e209

But

iex(65)> Pow.powa(phi, 10000)
** (ArithmeticError) bad argument in arithmetic expression: 1.5724845684981474e308 * 1.62

What? Why? And How do we fix this?

You have exceeded the size that can be fit into a 64 bit float. There is no fixing this without switching to integers.

3 Likes

This is a limitation in floating point arithmetic, the value gets to big, to be storable in 64 bit floating point.

1 Like

interestingly

Pow.powa(2, 10000) was working

19950631168807583848837421626835850838234968318861924548520089498529438830221946631919961684036194597899331129423209124271556491349413781117593785932096323957855730046793794526765246551266059895520550086918193311542508608460618104685509074866089624888090489894838009253941633257850621568309473902556912388065225096643874441046759871626985453222868538161694315775629640762836880760732228535091641476183956381458969463899410840960536267821064621427333394036525565649530603142680234969400335934316651459297773279665775606172582031407994198179607378245683762280037302885487251900834464581454650557929601414833921615734588139257095379769119277800826957735674444123062018757836325502728323789270710373802866393031428133241401624195671690574061419654342324638801248856147305207431992259611796250130992860241708340807605932320161268492288496255841312844061536738951487114256315111089745514203313820202931640957596464756010405845841566072044962867016515061920631004186422275908670900574606417856951911456055068251250406007519842261898059237118054444788072906395242548339221982707404473162376760846613033778706039803413197133493654622700563169937455508241780972810983291314403571877524768509857276937926433221599399876886660808368837838027643282775172273657572744784112294389733810861607423253291974813120197604178281965697475898164531258434135959862784130128185406283476649088690521047580882615823961985770122407044330583075869039319604603404973156583208672105913300903752823415539745394397715257455290510212310947321610753474825740775273986348298498340756937955646638621874569499279016572103701364433135817214311791398222983845847334440270964182851005072927748364550578634501100852987812389473928699540834346158807043959118985815145779177143619698728131459483783202081474982171858011389071228250905826817436220577475921417653715687725614904582904992461028630081535583308130101987675856234343538955409175623400844887526162643568648833519463720377293240094456246923254350400678027273837755376406726898636241037491410966718557050759098100246789880178271925953381282421954028302759408448955014676668389697996886241636313376393903373455801407636741877711055384225739499110186468219696581651485130494222369947714763069155468217682876200362777257723781365331611196811280792669481887201298643660768551639860534602297871557517947385246369446923087894265948217008051120322365496288169035739121368338393591756418733850510970271613915439590991598154654417336311656936031122249937969999226781732358023111862644575299135758175008199839236284615249881088960232244362173771618086357015468484058622329792853875623486556440536962622018963571028812361567512543338303270029097668650568557157505516727518899194129711337690149916181315171544007728650573189557450920330185304847113818315407324053319038462084036421763703911550639789000742853672196280903477974533320468368795868580237952218629120080742819551317948157624448298518461509704888027274721574688131594750409732115080498190455803416826949787141316063210686391511681774304792596709376

so I thought it could be some other issue.

when you say switching to integers, in this case it is not possible right?

Thats integers.

If you want to have phi which is some irrational constant as far as I remember. So you can’t make that an integer. You could though “round” at some level.

1 Like

just not happening with
1.5724845684981474e308 * 1.6

That’s what he’s saying. 1.5724845684981474e308 * 1.6 is a float, not an integer. 2 is an integer, not a float. Floats have a 64 bit size limit. Integers in Erlang are limited only by the available ram.

3 Likes

If you are willing to understand the issue deeper, Wikipedia’s article on IEEE-754 is quite good.

1 Like