Arduinoで大量の配列データを扱いたくてPROGMEMを使ったのですが、取り出したデータをdouble型にキャストするところでマイナスのデータが異常値になりました。互換基板でシリアル出力できない環境でしたので、しばらく悩んでしまいました。
その後UNOボードで確認したところ、pgm_read_wordは一度intで取り出さないとだめなようでした。きちんと理解していませんがとりあえず動作させることができました。
修正前

const int16_t data[] PROGMEM = {1,-2,-3,4,5};

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  for(int i=0; i<5; i++){
    double dValue = (double)(pgm_read_word(&data[i]));
    Serial.println(dValue);
  }
}

void loop() {
  // put your main code here, to run repeatedly:

}

//result
1.00
65534.00
65533.00
4.00
5.00

修正後

const int16_t data[] PROGMEM = {1,-2,-3,4,5};

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  for(int i=0; i<5; i++){
    int temp = pgm_read_word(&data[i]);
    double dValue = (double)temp;
    Serial.println(dValue);
  }
}

void loop() {
  // put your main code here, to run repeatedly:

}

//result
1.00
-2.00
-3.00
4.00
5.00