Я работаю над электронной таблицей, которая выполняет вычисления на очень малых числах порядка 1E-14. У меня был проект моего процесса, который использует электронную таблицу и не хранит данные в переменных VBA. Мне не нравится этот подход и я хочу взять весь процесс за кулисами в VBA.Точность вычисления электронных таблиц Excel, отличных от Excel VBA Calculation
Что я замечаю, я не могу подобрать два подхода. Те же операции разные результаты. Я работаю с Excel 2013
An example in a cell
=B42*COS(2*PI()*E$41*A42)
or if I plug in values taking all figures reported i get the following
0.156434465*Cos(2*3.14159265358979*0.012*0.05)
this results in
1.56433353400222E-01
Если бы я сделать то же самое в VBA
gsum = Round(data(i + 1, 1), 10) * Cos(2 * pi * Freq * i * dt)
or
0.156434465*Cos(2*3.14159265358979*0.012*1*0.05)
i get a different answer
Watch:Round(data(i + 1, 1), 10) * Cos(2 * Pi * Freq * i * dt):
0.156433353359992 : Variant/Double : Calculation.realFT
Я не знаю, как бороться с этим. Как-то я теряю каждый раз. Все на стороне VBA объявлено типа double, за исключением I.
Любые идеи о том, как я могу получить VBA, чтобы соответствовать точности электронных таблиц?
Я знаю, что различия небольшие, но я делаю много операций, и они складываются. Также я ограничен Excel для приложения.
UPDATE
Так что я смотрел на это еще немного, и я сузил, что проблема на этап muliplication между выходом косинуса и значением ячейки. В обоих версиях Excel и Excel VBA я могу видеть, что они оба одинаково, но я застрял со следующим
In Excel
0.999992893893247000000*0.156434465= 1.56433353400222E-01
In Excel VBA
0.999992893893247000000*0.156434465= 1.56433353359991861557855E-01
, кто прав?
Возможно, что косинус Excel лучше, чем у VBA. VBA является старым (без изменений с конца 1990-х годов), но сам Excel постоянно обновляется. Возможно, также проблема с 32-го и 64-разрядным версиями. –
@JohnColeman Хм, кажется, VBA не позволит мне использовать функцию листа ala WorksheetFunction.Cos. Во всяком случае, вокруг этого? – TheCodeNovice
I * думаю * это 'Application.Evaluate (" 0.156434465 * Cos (2 * 3.14159265358979 * 0.012 * 1 * 0.05) ")' будет использовать cos() вместо Excel(). Но - в моем случае (Excel 2010) я не могу обнаружить разницу между оценкой выражения VBA и Excel - они оба возвращают 0,156433353359992. Чарльз Уильямс - гуру, когда дело доходит до высокоточного Excel VBA. Вам может понравиться его блог: https://fastexcel.wordpress.com/. Это также круто: https://newtonexcelbach.wordpress.com/ –