英文:
LoadError when calling @printf within a function
问题
ERROR: LoadError: UndefVarError: @printf not defined
英文:
I try to print a table of results within a function by calling the macro @printf
. However, when I execute the code in Vscode (julia: execute the code in REPL), the interpreter throws a LoadError to me.
The code is following
function mysqrt_step(a,x)
0.5*(a + a/x)
end
function mysqrt(a,x; tol = 1e-8)
iters = 0
x_prime = 0.0
Δ = 1000.0
while dist > tol
x_prime = mysqrt_step(a,x)
Δ = abs(x - x_prime)
x = x_prime
iters += 1
end
return(x,iters)
end
using Printf # use the Printf package (built-in)
function sqrt_table()
@printf("%2s %10s %10s %10s \n", "a", "mysqrt", "sqrt", "Iterations")
for a in 2:10
tmp = mysqrt(a,a^2)
@printf("%2d %10f %10f %10d \n", a, tmp[1], sqrt(a), tmp[2])
end
end
The error message is
> ERROR: LoadError: UndefVarError: @printf not defined
To be noticed, I have using Printf
before defining the function
version information
Julia Version 1.7.1
Commit ac5cc99908 (2021-12-22 19:35 UTC)
Platform Info:
OS: Windows (x86_64-w64-mingw32)
CPU: Intel(R) Core(TM) i7-6820HQ CPU @ 2.70GHz
WORD_SIZE: 64
LIBM: libopenlibm
LLVM: libLLVM-12.0.1 (ORCJIT, skylake)
Environment:
JULIA_EDITOR = code
JULIA_NUM_THREADS =
答案1
得分: 1
以下是翻译好的内容:
"Thanks for providing a minimum working example, but do make sure to re-run it in a fresh Julia session to make sure it actually reproduces your problem.
When I copy paste your code into a fresh Julia 1.7 session and run the sqrt_table()
function, I get:
julia> sqrt_table()
a mysqrt sqrt Iterations
ERROR: UndefVarError: dist not defined
Stacktrace:
[1] mysqrt(a::Int64, x::Int64; tol::Float64)
@ Main .\REPL[2]:6
So as Bill says in his comment, the error here is that the reference to dist
in the while
loop is undefined, and you probably meant to write while Δ > tol
.
Also note that before the function errors, it prints the header line that you put into sqrt_table()
, so there's actually no issue with Printf
in your code.
With the distance variable name fixed, your code returns:
julia> sqrt_table()
a mysqrt sqrt Iterations
2 1.618034 1.414214 21
3 2.186141 1.732051 18
4 2.732051 2.000000 16
5 3.265564 2.236068 15
6 3.791288 2.449490 14
7 4.311738 2.645751 14
8 4.828427 2.828427 13
9 5.342329 3.000000 12
10 5.854102 3.162278 12
英文:
Thanks for providing a minimum working example, but do make sure to re-run it in a fresh Julia session to make sure it actually reproduces your problem.
When I copy paste your code into a fresh Julia 1.7 session and run the sqrt_table()
function, I get:
julia> sqrt_table()
a mysqrt sqrt Iterations
ERROR: UndefVarError: dist not defined
Stacktrace:
[1] mysqrt(a::Int64, x::Int64; tol::Float64)
@ Main .\REPL[2]:6
So as Bill says in his comment, the error here is that the reference to dist
in the while
loop is undefined, and you probably meant to write while Δ > tol
.
Also note that before the function errors, it prints the header line that you put into sqrt_table()
, so there's actually no issue with Printf
in your code.
With the distance variable name fixed, your code returns:
julia> sqrt_table()
a mysqrt sqrt Iterations
2 1.618034 1.414214 21
3 2.186141 1.732051 18
4 2.732051 2.000000 16
5 3.265564 2.236068 15
6 3.791288 2.449490 14
7 4.311738 2.645751 14
8 4.828427 2.828427 13
9 5.342329 3.000000 12
10 5.854102 3.162278 12
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论