2013-05-16 2 views
4

У меня есть внешнее приложение, которое отслеживает процессор и GPU температуру ...
Почему сопоставление строк строки lua делает это?

Я использую Lua с alien extension, чтобы захватить эти значения (через GetWindowText) и сделать некоторый шаблон этих значений, эффективно извлекать температуру цифры из строки, которая по умолчанию отображается как-то вроде CPU 67.875 °C ...
Но, возможно, у меня есть неправильная идея о том, как шаблоны работают в LUA (поскольку они не похожи на регулярные выражения)?

Образец, который я использую, - [%d]+[.%d+]*, который должен соответствовать любому числу от 0 до 100,0, правильно?
Как ни странно, я getting incredibly strange output, когда значения достигают около 56,5 градусов (см. Ссылку).

Почему это происходит?
И как я могу извлечь правильные значения с плавающей точкой (в виде строки) в диапазоне от 0 до 100 в формате XYY.ZZZ, где X не обязательно, Y не является обязательным, и . не является обязательным, если Z не существует?

ответ

5

Вы видите эффект накопленных ошибок округления, потому что 0.16 не может быть точно представлен в плавающей точке. Приведенный ниже код работает лучше:

local n = 0 
while n < 10000 do 
    local s = tostring(n/100) 
    local t = s:match("[%d]+[.%d+]*") 
    print(t) 
    n = n + 16 
end 

Теперь на ваш вопрос, попробуйте простой рисунок ниже:

s="CPU 67.875 °C" 
print(s:match("CPU +(.-) +")) 
+0

Ладно, я понял, что это просто математическое состояние гонки сортов ... Но это еще не объясняет _why_ он решает сойти с ума на полпути и продолжает дальше до бесконечности. – RectangleEquals

+2

@RectangleEquals, см. [Руководство по плавающей точке - что каждый программист должен знать о арифметике с плавающей точкой] (http://floating-point-gui.de/). – lhf

+0

@RectangleEquals: Обратите внимание, что, хотя ваш шаблон не имеет к этому никакого отношения (вы можете просто распечатать 's' и увидеть то же самое), ваш шаблон также неверен. Вам нужно избегать '.' и проверять только на * один из них во втором предложении:' [% d] +%.? [% D] * '. В противном случае вы можете разбирать «10aaaaa4bdcedd5» так же легко, как «10.45». –

 Смежные вопросы

  • Нет связанных вопросов^_^