 static const unsigned int finetuning = 50; // fine-tuned with an oscilloscope
 static const unsigned int timerPreload = 65536 - systemHz / prescaler / (1 / bitLength) + finetuning;
 
+static const double two_to_32 = 4294967296.0;
+
 // how much to advance curTimeFractions in the interrupt handler
-volatile uint32_t fractionsPerOverflow = 4294967296.0 * bitLength;
+volatile uint32_t fractionsPerOverflow = two_to_32 * bitLength;
 
 void setupTimer()
 {

      d = buf[UDP_DATA_P + TRANSMIT_TIMESTAMP_P + 7];
      uint32_t t2 = ((a << 24) | (b << 16) | (c << 8) | d);
      noInterrupts();
      curTime = t1;
      curTimeFractions = t2;
      interrupts();
      struct tm tm;
      gmtime_r(t1, &tm);
      Serial.println(tm.tm_mday);
      Serial.println(tm.tm_mon + 1);
      Serial.println(tm.tm_year);
      Serial.println(tm.tm_hour);
      Serial.println(tm.tm_min);
      Serial.println(tm.tm_sec);
      knowTime = true;
    }
  }
}

               buf[ICMP_TYPE_P]==ICMP_TYPE_ECHOREQUEST_V) {
      es.ES_make_echo_reply_from_request(buf, length);
    } else if (buf[IP_PROTO_P] == IP_PROTO_UDP_V && buf[UDP_DST_PORT_L_P] == ntpPort && length == UDP_DATA_P + NTP_PACKET_SIZE) {
      digitalWrite(debug, HIGH);
      // NOTE: requires disabling the pass-only-arp-broadcast filter from enc28j60
      uint32_t a = buf[UDP_DATA_P + TRANSMIT_TIMESTAMP_P + 0];
      uint32_t b = buf[UDP_DATA_P + TRANSMIT_TIMESTAMP_P + 1];
      uint32_t c = buf[UDP_DATA_P + TRANSMIT_TIMESTAMP_P + 2];
