round() and signif() aren't working

question
error

#1

Hi, I’m new to Julia.

I’m trying to use the round() command so that an == condition works properly (don’t need 60 decimal points). For example: round(pi, 3) returns:
ERROR: MethodError: no method matching round(::Irrational{:π}, ::Int64)
round(5.6789, 3) returns:
ERROR: MethodError: no method matching round(::Float64, ::Int64)

Attempting to use signif() returns:
ERROR: UndefVarError: signif not defined

How do I fix Julia to follow its documentation for these basic commands?


#2

You must be looking at the documentation from an older version of Julia: in 0.7 and later round takes a keyword digits or sigdigits keyword:

julia> round(pi, digits=3)
3.142

julia> round(pi, sigdigits=3)
3.14

However this is probably not a good way to check for approximate equality since it can be very brittle (e.g. very close numbers can round in opposite directions). I would suggest you use isapprox (or its infix form ) instead


#3

Ok, thanks for the update on the syntax. I think isapprox might be a better way to do what I want since I’ve got to use an equation as the input, and round() appears to only work with simple arithmetic.

However, I’m still having trouble making it do what I want it to.
@constraint(m, [i = 1:nREGION], isapprox((PRODUCE[i]-CONSUME[i])*10^9 + sum(VolShip[i,j] for j=1:nREGION) - sum(VolShip[j,i] for j=1:nREGION), 0))

spits out this error:

ERROR: LoadError: LoadError: Unrecognized sense isapprox
Stacktrace:
[1] _canonicalize_sense(::Symbol) at C:\Users\kirbo.julia\packages\JuMP\PbnIJ\src\macros.jl:303
[2] @constraint(::LineNumberNode, ::Module, ::Vararg{Any,N} where N) at C:\Users\kirbo.julia\packages\JuMP\PbnIJ\src\macros.jl:484

Essentially I’ve got a mass balance problem with multiple options. right now I’ve got it reduced to 3 nodes, but I want to expand. It worked with three briefly before I made inputs with decimal spaces - now Julia’s excessive decimal places screwed things up.

Is there a better function for dealing with open ended macros like JuMP?


#4

I’m guessing JuMP doesn’t support isapprox. The easiest option is to make it an inequality:

@constraint(m, [i = 1:nREGION], -tol <= (PRODUCE[i]-CONSUME[i])*10^9 + sum(VolShip[i,j] for j=1:nREGION) - sum(VolShip[j,i] for j=1:nREGION) <= tol)

for some appropriate value tol.