2017-03-27 3 views
0
target="/home/walia6/Math/fib" 
os.execute("echo 1 > "..target) 
os.execute("echo 1 >> "..target) 
while true do 
    local handle = io.popen("wc -l < "..target) 
    ct = handle:read("*a") 
    handle:close() 
    os.execute("echo "..ct) 

    tmp=("sed -n "..(ct-1).."p "..target) 
    --os.execute("echo '"..tmp.."'") 
    local handle = io.popen(tmp) 
    pn = handle:read("*a") 
    handle:close() 

    tmp=("sed -n "..(ct-0).."p "..target) 
    --os.execute("echo '"..tmp.."'") 
    local handle = io.popen(tmp) 
    cn = handle:read("*a") 
    handle:close() 

    os.execute("echo "..(string.format("%.0f",cn+pn)).." >>"..target) 
end 

위의 코드는 Linux의 Lua를 실험하면서 만든 코드이다. 내가 루아를 테스트하는 것보다 리눅스를 더 많이 테스트했다.임의의 지점에서 정확성에 문제가있다.

피보나치 발전기가 78 번째 숫자가 생성 된 후에 부정확하게 나타났습니다. 이것은 상당히 임의적 인 숫자 인 것 같아서 왜 어떤 종류의 오버 플로우와 같은 오류가 나는지 이유를 생각할 수 없습니다.

누구나 알 수 있습니까?

답변

3

피보나치 수가 기하 급수적으로 증가하기 때문에 아마도 오버플로가됩니다.

루아 5.3 이전에는 루아의 모든 숫자가 배정 밀도 부동 소수점 숫자입니다. 즉, 최대 52 비트 정수를 정확하게 나타낼 수 있습니다. 실제로, F (78) = 8944394323791464는 정확하게 표현 될 수 있지만 F (79) = 14472334024676221는 표현할 수 없습니다.

64 비트 정수를 갖는 루아 5.3에서 피보나치 수는 F (92) = 754011380474634642까지 정확하게 나타낼 수 있습니다.