forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   С# (http://forum.boolean.name/forumdisplay.php?f=128)
-   -   Проблема в освении)) (http://forum.boolean.name/showthread.php?t=11030)

shpak 27.11.2009 11:35

Проблема в освении))
 
Допустим мне надо высчитать приращение х и у для расчета следующей точки в окружности, т.е. я пишу конструкцию типа
X = Math.Round(x0 + R * Math.Asin(a));
Y = Math.Round(y0 + R * Math.Acos(a));
Вылетает эррор:
Error 1 Cannot implicitly convert type 'double' to 'float'. An explicit conversion exists (are you missing a cast?)
Кто подскажет?

Dream 27.11.2009 11:47

Ответ: Проблема в освении))
 
X = (float)Math.Round(x0 + R * Math.Asin(a));
Y =(float) Math.Round(y0 + R * Math.Acos(a));
скорее всего так. попытайся приводить нужные числа к нужным типам. подскащки какие имеена числа не совпадают по типам студия обычно даёт
X = Math.Round(x0 + R * (float)Math.Asin(a));
Y = Math.Round(y0 + R * (float)Math.Acos(a));
или так:)) нужно смотреть конкретно
xD

SBJoker 27.11.2009 11:50

Ответ: Проблема в освении))
 
видимо X и Y типа float у тебя.
C# считает ошибкой даунгрейд типов, т.е. когда double (8байт) присваивается к переменной типа float(4байт), то точность данных падает. Есть два пути:
* сделать все участвующие переменные типа double
* сделать каст (насильное привидение типов)

X = (float)Math.Round(x0 + R * Math.Asin(a)); // при условии что x0, y0 и R типа double
Y = (float)Math.Round(y0 + R * Math.Acos(a));

А ещё можно даунгрейднуть значения косинуса:
X = Math.Round(x0 + R * (float)Math.Asin(a));
Y = Math.Round(y0 + R * (float)Math.Acos(a));

Dream 27.11.2009 11:57

Ответ: Проблема в освении))
 
честно, есдинственое чем мне не нравятся языки типа С++ и шарп так это ихняя маниакальная любовь к чёткому определения где какие типы, и чтобы все приведения типов были явно указаны юзером.

jimon 27.11.2009 12:13

Ответ: Проблема в освении))
 
DimasSup

вообще это разумно для языков которые позволяют юзеру делать свои типы, double это 8 байт, float это 4 байта, и double в float превращается никак не копированием 4 байт

Dream 27.11.2009 13:03

Ответ: Проблема в освении))
 
я то понимаю, просто меня раздражает когда прозевал гдето разнность типов, и начинается пляска вокруг одной строки

SBJoker 27.11.2009 13:05

Ответ: Проблема в освении))
 
Всё это оффтоп, C# четко типизированный язык, однако никто немешает определить автоматические методы конвертации, например как определён почти для всех типов данных метод ToString() который автоматически вызывается при попытках работы с данными как со строкой.

Иными словами как и С++, язык позволяет подстраивать его под себя.
Учитывая что C# задумывался как язык написания приложений с высокой отказоустойчивостью, то такие требования к коду вполне нормальны, так же существует мнение что правильно спроектированное приложение содержит минимум мест в коде требующих приведения типов в сторону даунгрейда.

Так же всвязи с поддержкой многопоточности по-умолчанию, в языке под запретов обыкновенные указатели, однако им на замену пришли умные указатели, ссылки и прочие защищенные сущности. Однако в секции unsafe{ } возможно использование любых небезопасных конструкций.

shpak 27.11.2009 14:20

Ответ: Проблема в освении))
 
Цитата:

Сообщение от DimasSup (Сообщение 127143)
X = (float)Math.Round(x0 + R * Math.Asin(a));
Y =(float) Math.Round(y0 + R * Math.Acos(a));

И ведь работает)) Мужики вы боги)) я тут с бубном два часа над строчкой просидел)))) Уж думал дело без водки не обойдётся:)

Dream 27.11.2009 14:25

Ответ: Проблема в освении))
 
всегда рады помочь:)


Часовой пояс GMT +4, время: 08:43.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot