Получение полезного лечения NaN и Inf с помощью Microsoft C ++ - PullRequest
3 голосов
/ 24 октября 2011

Рассмотрим следующую тестовую программу

#include <iostream>
#include <stdio.h>
using namespace std;

 int main(int argc, char* argv[])
{
double a=1,c=0;
double i = a/c;   // divide by 0 yields infinity
double j = a*4.5;
double k = c/c;  // 0 divide 0 yields NaN
FILE * fp = fopen("ttt.txt","wt");
fprintf(fp,"%f\t%f\t%f\t",i,j,k);
fclose(fp);

double aa,bb,cc;
fp = fopen("ttt.txt","rt");
fscanf(fp,"%lf%lf%lf",&aa,&bb,&cc);
cout<<aa<<endl<<bb<<endl<<cc<<endl;
}   

, когда она скомпилирована с помощью gcc (любая платформа, на которой я пробовал), создает файл ttt.txt с содержимым

Inf 4.500000 NaN

дает вывод

Инф4.5NaN

Никаких сюрпризов.Правильное поведение в соответствии с правилами C99 и такими вещами, как Matlab

Компиляция той же программы в Microsoft Visual Studio 2008, однако, дает файл ttt.txt с содержимым

1. # INF00 4.500000 -1. # IND00

и дает вывод

1-9.25596e + 061-9.25596e + 061

Так что Microsoft C не может даже прочитать свои собственные представления Inf и NaN, не говоря уже о стандартных, что совершенно бесполезно - любая причина, по которой они так это реализовали бы, совершенно мне не подходит.Я знаю, что MSVcc не полностью совместим с C99 - НО у кого-нибудь есть предложения о том, как убедить его прочитать и записать эти значения, переключатели компилятора, другую версию stdio.h, что угодно.

Похоже, чтоЕдинственный способ обойти это - реализовать мои собственные функции для замены fscanf и fprintf, но это похоже на переизобретение колеса.Я не могу поверить, что я первый, кто нашел это раздражающим - вплоть до того, чтобы сделать библиотеку stdio Microsoft бесполезной, и все же Google ничего не поднимает по этому вопросу

...