У меня есть длинная схема цифровой интеграции, написанная на C. Я бы хотел проверить свой алгоритм с точностью с плавающей точкой. Есть ли способ сказать gcc опускать все вхождения double
на float
во всей программе?Компиляция кода c с поплавком вместо double
ответ
Вы не можете смело сделать это без изменения исходного кода, но это не должно быть ужасно сложно сделать.
Использование препроцессора для принудительного использования ключевого слова 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)
решит вызвать правильную функцию квадратного корня в зависимости от типа аргумента.
typedef double float;
Прежде чем какие-либо дубликаты, которые вы хотите заменить, должны работать, однако им следует предупредить, что это может смутить некоторые внешние библиотеки.
В будущем, лучший подход определить собственный тип поплавка:
#ifdef USE_FLOATS
typedef float MyFloatType;
#else
typedef double MyFloatType;
#endif
шаблоны
или использования, который имеет дополнительное преимущество, что позволяет изменить код во время выполнения, чтобы использовать один или другой ,
GCC (4.9.0 в Mac OS X 10.9.4) не нравится: 'xc: 1: 16: ошибка: два или более типа данных в спецификаторах объявлений, где' xc' содержит одну строку 'typedef double float ; '. Есть и вторая ошибка, но это в основном следствие первого. –
'typedef double float;' - синтаксическая ошибка. Имя typedef должно быть идентификатором; 'float' - это ключевое слово. И шаблоны не являются полезным предложением, если OP не хочет переключать языки с C на C++. –
- 1. Компиляция кода C с VLD
- 2. Компиляция кода на C++ с использованием __float128
- 3. Компиляция кода C++ с источником .cpp, но не с .c
- 4. шаблон C++ специализации с поплавком
- 5. компиляция кода c компилятором C++
- 6. Алхимия C Компиляция кода
- 7. Компиляция кода C для .NET
- 8. Компиляция кода C с использованием нескольких компиляторов
- 9. Компиляция кода C с использованием zmq API
- 10. Компиляция кода C с g ++: неверное преобразование
- 11. Компиляция кода C++ с компонентами Qt
- 12. Компиляция кода MFC с C# Приложение Windows
- 13. Компиляция кода динамически с использованием C#
- 14. Компиляция кода C с конфликтующими типами
- 15. Компиляция кода C с Redis на Linux
- 16. Компиляция C кода с источником Lua
- 17. Компиляция кода C внутри кода C++ внутри Objective-C++ код
- 18. Компиляция кода C# .net 4 .net 3.5?
- 19. Компиляция кода C/C++ на MacOS
- 20. C# динамическая компиляция и генерация кода
- 21. Компиляция и запуск кода на C# программно
- 22. Компиляция кода Странно
- 23. Компиляция кода Yacc
- 24. компиляция кода синусоидального кода
- 25. double vs. double * in C++
- 26. C# - 'Double' неоднозначная ссылка
- 27. Компиляция кода VB с CodeDom
- 28. Компиляция кода с сайта ASP.NET
- 29. Создать массив с одним поплавком из double-float в lisp?
- 30. Двойная печать с поплавком
Добавляет ли '#define double float' в ваш источник работу для вас? Unfortunatley, '-Ddouble = float' не работает, потому что это повлияет на заголовки системы. – lhf