Scusa, ma hai capito cosa fa questa linea?
float a = (argc - 2)?: strtod(argv[1], 0);
Ho capito solo che una costante è rappresentata da 8byte e il float da 4 byte.
Più che altro il compilatore assume che la costante
answer sia un double.
se scrivi
#define answer 3.141593f // notare la f finale
Il compilatore la interpreta come float.