Arduino поддерживает 4-байтовый двойной тип данных. и ваш код действительно выдает допустимое двойное значение, которое не является переполнением (ovf).
Проблема, которую вы видите, связана с тем, как Arduino реализует функцию Serial.print()
, которая почти наполовину приготовлена для поддержки плавающей запятой и не так надежна, как vprintf () доступно в avr-lib c. Вы можете увидеть исходный код здесь , который печатает ovf
для всего, что больше 4294967040.0 или меньше, чем -4294967040.0. Я подумал, что ESP8266 Arduino Core исправил это, вместо того, чтобы наследовать уродливую реализацию Arduino Serial.print()
, но, очевидно, нет.
К счастью, ESP8266 Arduino Core имеет метод Serial.printf()
, который обеспечивает лучший рендеринг с плавающей запятой. Этот код покажет, что ваш номер действительно является действительным числом для двойного типа данных.
void setup(){
Serial.begin(9600);
while(!Serial);
double te = 68000;
double res = te * te;
Serial.println(res); //this will produce 'ovf'
Serial.printf("Result=%f\n", res); //this will produce correct 4624000000.000000
}
Обратите внимание, что Serial.printf()
- это реализация ESP8266, определяемая c для поддержки полной плавающей запятой vprintf()
в стандарте библиотека. Он недоступен для стандартных плат Arduino.
Для плат Arduino есть способ использовать sprintf()
, который наследуется от vprintf()
, для печати правильной плавающей запятой с некоторыми изменениями параметров компоновщика в процессе компиляции кода. У меня есть запись в блоге Знаете ли вы Arduino - sprintf () и плавающая точка говорят о том, как это сделать.