Ищете более простой способ использования поплавков в C#

По ряду причин мне приходится использовать в своем коде числа с плавающей запятой вместо двойных. Чтобы использовать литерал в моем коде, я должен написать что-то вроде:

float f = 0.75F;

или компилятор будет блевать, поскольку он рассматривает только "0,75" как двойное. Есть ли что-нибудь, что я могу поместить в свой код или установить в Visual Studio, что заставит его обрабатывать литерал, например «0,75», как число с плавающей запятой без необходимости каждый раз добавлять «F»?


person MusiGenesis    schedule 20.07.2009    source источник
comment
Ну давай же! Сколько констант с плавающей запятой вам нужно определить? Если много, просто используйте «Найти и заменить» несколько раз.   -  person leppie    schedule 20.07.2009
comment
Я согласен с @leppie. Вы действительно должны ограничить такие литералы в любом случае. Если вы выполняете много назначений по умолчанию, и обычно это одно и то же значение, переместите их куда-нибудь в статический внутренний класс и ссылайтесь на них таким образом. Кроме того, вы можете использовать строчную букву f вместо прописной буквы F для обозначения литерала с плавающей запятой, что избавит вас от нажатия клавиши Shift. Если вам не все равно. :)   -  person Randolpho    schedule 20.07.2009
comment
Мне любопытно, почему кто-то когда-либо использовал поплавки вместо двойников. Можете ли вы рассказать нам о вашем количестве причин?   -  person Eric Lippert    schedule 20.07.2009
comment
@ Эрик: из любопытства; Вы знаете, было ли это преднамеренным шагом в дизайне, чтобы способствовать использованию двойного плавания?   -  person Fredrik Mörk    schedule 20.07.2009
comment
@Eric: числа с плавающей запятой занимают вдвое меньше памяти, чем двойные, а операции обработки массива (например, умножение каждого значения в массиве на определенное значение) выполняются быстрее с числами с плавающей запятой (часто в два раза быстрее). Эти различия несущественны для большинства программ, но очень существенны для программного синтезатора, работающего на смартфоне.   -  person MusiGenesis    schedule 20.07.2009
comment
@Randolpho: мое ОКР не позволяет мне использовать строчную букву f. :(   -  person MusiGenesis    schedule 20.07.2009
comment
Звучит как классное приложение!   -  person Eric Lippert    schedule 20.07.2009
comment
И да, в большинстве приложений вы всегда хотите либо двойное, либо десятичное число, поэтому число с плавающей запятой не является значением по умолчанию. (Честно говоря, я бы предпочел, чтобы по умолчанию использовалась десятичная дробь, так как больше людей занимаются финансовыми вычислениями, чем научными.) Во многих процессорах все операции в любом случае выполняются в двойном формате, поэтому числа с плавающей запятой не быстрее, и в большинстве приложений дополнительные четыре байта не имеют значения. Я вижу, что на портативном устройстве ни одно из этих условий не будет выполнено, и поэтому становится более разумным использовать float.   -  person Eric Lippert    schedule 20.07.2009
comment
@Eric: в моих тестовых тестах (выполненных в Vista на моем ПК) итерация по массиву и умножение или добавление к каждому значению в массиве занимает примерно в два раза больше времени с двойным [] чем с плавающей точкой той же длины [] . Я изменил double[] на float[], чтобы ускорить версию для Windows Mobile, но двукратное увеличение скорости на ПК тоже неплохо. (У моего ПК 32-битный процессор - я думаю, эта разница исчезнет на 64-битной машине).   -  person MusiGenesis    schedule 20.07.2009
comment
+1 для десятичных знаков по умолчанию, как бы необычно это ни было.   -  person Jon Skeet    schedule 20.07.2009
comment
Проблема в том, что некоторые фреймворки (я не буду называть имена, но вспомните фреймворк для разработки игр, который начинается с X и сделан крупной компанией-разработчиком программного обеспечения) везде, где это возможно, используют число с плавающей запятой, поэтому практически каждое число имеет маленькая буква F прикреплена к концу. :(   -  person RCIX    schedule 21.07.2009
comment
@RCIX: это не только XNA. Многие, многие игровые библиотеки предпочитают числа с плавающей запятой с одинарной точностью, а не числа с двойной точностью.   -  person ChrisV    schedule 22.07.2009


Ответы (6)


Поплавок идет с F :-)

person chikak    schedule 20.07.2009

Нет - к счастью, ИМО. Литералы везде обрабатываются одинаково.

Это хорошо — представьте, что какой-нибудь разработчик сопровождения приходит и смотрит на ваш код через год. Он видит «0,75» и думает: «Я знаю C# — это двойное число! Подождите, как оно присваивается переменной с плавающей запятой?» Ик.

Неужели так больно везде добавлять букву "Ф"? У вас действительно столько констант? Не могли бы вы извлечь их как постоянные значения, чтобы все ваши литералы с "F-суффиксом" были в одном месте.

person Jon Skeet    schedule 20.07.2009
comment
Как я уже упоминал в своем комментарии к исходному вопросу, я согласен; ограничивайте свои литералы и извлекайте их как константы для максимальной удобства обслуживания. - person Randolpho; 20.07.2009
comment
Порезать запястья не больно, но раздражает. То, что я делаю, в значительной степени является экспериментальным и включает в себя настройку значений параметров и тестирование результатов. Иногда их много в формуле, так что можно забыть добавить много букв F. - person MusiGenesis; 20.07.2009
comment
Затем используйте двойные числа во время своих тестов и переключитесь на поплавки позже. - person Randolpho; 20.07.2009
comment
Рассмотрите возможность чтения их из файла конфигурации. Это упрощает настройку алгоритмов, и вы можете опустить столько f, сколько захотите. - person peterchen; 20.07.2009
comment
@peterchen: я не только настраиваю значения, подаваемые в алгоритмы, я также настраиваю и меняю сами алгоритмы. Загрузка их из конфигурационного файла была бы ненужным дополнительным шагом на данном этапе. - person MusiGenesis; 20.07.2009

К сведению: все параметры компилятора для C# можно найти по адресу http://msdn.microsoft.com/en-us/library/6ds95cz0.aspx. Если вы проверите там, вы увидите, что нет никакой опции, которая позволяет это сделать, и это правильно по причинам, которые отметил @Jon Skeet.

person tvanfosson    schedule 20.07.2009

Язык везде интерпретирует литералы точности с плавающей запятой как удвоения. Это не настраиваемая функция компилятора - и на то есть веская причина.

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

Хотя в целом это не рекомендуется, вы можете немного уменьшить боль в C# 3, используя:

var f = 0.75F;

Просто будьте осторожны, потому что забывание суффикса «F» с этим синтаксисом приведет к тому, что компилятор создаст двойное, а не плавающее число.

person LBushkin    schedule 20.07.2009
comment
Это совсем не уменьшает эту боль. Я все еще должен ввести F. - person MusiGenesis; 20.07.2009
comment
Это то место, где я не стал бы использовать синтаксис var только по той причине, которую вы описали. С другой стороны, я бы использовал двойные числа, а не поплавки... - person tvanfosson; 20.07.2009
comment
Некоторые языки позволяют переопределить интерпретацию кода с помощью макросов, например C. Он не был включен в C#, потому что он не очень полезен и из него так легко сделать беспорядок. :) - person Guffa; 20.07.2009
comment
Подход var здесь кажется немного опасным. float f = 0.75; по крайней мере вызовет реакцию компилятора; похоже на хорошую страховочную сетку. - person Fredrik Mörk; 20.07.2009
comment
@FredrikMörk: если бы компилятор следовал принципу, согласно которому преобразования из более конкретных типов в менее конкретные типы сопоставимого домена расширяются (т. Е. Разрешаются неявно), в то время как преобразования из менее конкретных типов в более конкретные требуют приведения, float f=0.75; или даже float f=0.1; будет компилироваться без крика, но double f=0.1f; будет кричать при отсутствии явного приведения типа (например, double f = (double)0.1f;. К сожалению, в Java реализованы обратные правила, и .net последовала их примеру. - person supercat; 24.05.2012

Я бы посоветовал вам всегда использовать

var meaning = 1f;

потому что ключевое слово "var" экономит много времени на человеческую интерпретацию и обслуживание.

person Jader Dias    schedule 21.07.2009
comment
Я не уверен, действительно ли это спасает какую-либо человеческую интерпретацию - заставляя меня смотреть на конец (f) для типа вместо того, чтобы позволить мне полагаться на обычное соглашение С# о том, что тип должен быть первым, оставляет больше места для ошибок и занимает больше времени имхо. - person user12345613; 19.06.2012

Правильное поведение для компилятора заключалось бы не в том, чтобы интерпретировать литералы без суффиксов как числа с одинарной точностью, а в том, чтобы признать, что преобразования из double в float следует рассматривать как расширяющие преобразования, поскольку для каждого значения double существует либо ровно одно однозначно -правильное float представление, или (в некоторых редких крайних случаях) будет точно два одинаково хороших значения, ни одно из которых не будет больше, чем часть на квадриллион от однозначно правильного значения. Семантически преобразования из float в double следует рассматривать как сужающие преобразования (поскольку они требуют, чтобы компилятор «угадывал» информацию, которой у него нет), но практические трудности, которые могут возникнуть, могут оправдать выполнение преобразований в этом направлении «расширение».

Возможно, следует обратиться в Microsoft с просьбой добавить расширяющее преобразование из double в float? Нет веской причины, по которой код, вычисляющий графические координаты как double, должен быть загроможден приведением типов при вызове функций рисования.

person supercat    schedule 09.06.2012