2014-07-11 2 views
4

У меня есть длинная схема цифровой интеграции, написанная на C. Я бы хотел проверить свой алгоритм с точностью с плавающей точкой. Есть ли способ сказать gcc опускать все вхождения double на float во всей программе?Компиляция кода c с поплавком вместо double

+3

Добавляет ли '#define double float' в ваш источник работу для вас? Unfortunatley, '-Ddouble = float' не работает, потому что это повлияет на заголовки системы. – lhf

ответ

4

Вы не можете смело сделать это без изменения исходного кода, но это не должно быть ужасно сложно сделать.

Использование препроцессора для принудительного использования ключевого слова double в вашей программе для обработки как float - плохая идея; это затруднит чтение вашей программы, и если вы используете long double в любом месте, это будет рассматриваться как long float, что является синтаксической ошибкой.

Как stix's answer предполагает, вы можете добавить typedef, либо в верхней части вашей программы (если это один исходный файл) или в каком-заголовке, который #include ред всех соответствующих исходных файлов:

typedef double real; /* or pick a different name */ 

Затем перейдите к исходному коду и измените каждое вхождение double на real. (Будьте осторожны с тем, чтобы делать слепой глобальный поиск и замену.)

Убедитесь, что программа по-прежнему скомпилирована, работает и ведет себя так же после этого изменения. После этого вы можете изменить ЬурейеЕ к:

typedef float real; 

и перекомпилировать использовать float вместо double.

Это не совершенно это простой, все же. Если вы используете функции, объявленные в <math.h>, вы хотите использовать правильную функцию для любого типа с плавающей точкой, который вы используете; например, sqrt() предназначено для double, sqrtf() для float и sqrtl() предназначено для long double.

Если ваш компилятор поддерживает его, вы можете использовать <tgmath.h> заголовок, который определяет тип унифицированной макросы соответствующей математические функции от <math.h>. Если вы используете <tgmath.h>, то sqrt(x) решит вызвать правильную функцию квадратного корня в зависимости от типа аргумента.

+0

Hm. Спасибо за ответ. Наверное, я мог бы написать простой скрипт 'sed' для замены всего появления' double', 'sqrt()' и т. Д. – hanno

+0

Выполнено. Работал. Благодаря! – hanno

0
typedef double float; 

Прежде чем какие-либо дубликаты, которые вы хотите заменить, должны работать, однако им следует предупредить, что это может смутить некоторые внешние библиотеки.

В будущем, лучший подход определить собственный тип поплавка:

#ifdef USE_FLOATS 
    typedef float MyFloatType; 
#else 
    typedef double MyFloatType; 
#endif 
шаблоны

или использования, который имеет дополнительное преимущество, что позволяет изменить код во время выполнения, чтобы использовать один или другой ,

+0

GCC (4.9.0 в Mac OS X 10.9.4) не нравится: 'xc: 1: 16: ошибка: два или более типа данных в спецификаторах объявлений, где' xc' содержит одну строку 'typedef double float ; '. Есть и вторая ошибка, но это в основном следствие первого. –

+0

'typedef double float;' - синтаксическая ошибка. Имя typedef должно быть идентификатором; 'float' - это ключевое слово. И шаблоны не являются полезным предложением, если OP не хочет переключать языки с C на C++. –

Смежные вопросы