Re[5]: Преобразование чисел в C#
От: Аноним  
Дата: 11.10.06 13:33
Оценка: -1
писал я как то функцию округления....
так вот она округляла доублы,
как получалось это не правильным сопсобом так:
1)рпеобразовываем в строку
2)режем целое и дробь (строки)
3)формируем строки с ужетом округления:
— целое
— дробь
— перенос.
4)все строки конвертим в доубл и складываем
та вот при сложении трех доублов результат, который также был доубл иногда сбивался например с 3.37 на 3.3699999999999.....
так вот дело оказалось в том, что у не хватает точности доублов (с конца). и правильный выход в этом случае — складывать все в децимал, т.к. у него разрядность больше, а потом, через строку, можно конвертировать в доубл.





данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 10.01.07 08:41
Оценка:
Я хренею, дорогая редакция...

Народ, есть в C# такое понятие, как литералы.
Например, 2 — это литерал. Он имеет тип Int32.

Т.е. если Вы напишете такой код:
long x = 2;
2 приведётся к Int32, а потом — к long.
Правильной будет такая запись:

// 2 уже имеет тип long
long x = 2L; // Оно даже компилируется!!!

Дальше разбирайтесь, направление есть.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 10.01.07 09:02
Оценка:
Не надо так недооценивать компилятор: в этом случае не будет в коде приведения 2 сначала к инту а потом к лонгу.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 10.01.07 10:08
Оценка:
Правильно!
Зачем марать руки и форум доказательствами?
Не надо никаких доказательств.
Одна Баба Сказала — лучший аргумент!


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 10.01.07 13:48
Оценка:
И точно, чего это я сразу не заметил что ты доказательств то своих слов не привел. Показывай код на MSIL где мы увидим сначала приведение к инту а потом к лонгу


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 11.01.07 09:35
Оценка:
Итак, код функции:

static void Main(string[] args)
{
long x = 2L;
long y = 2;

Console.WriteLine((x * y).ToString());
}

IL код (режим компиляции — Release):

.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 2
.locals init (
[0] int64 num1,
[1] int64 num2,
[2] int64 num3)
L_0000: ldc.i4.2
L_0001: conv.i8
L_0002: stloc.0
L_0003: ldc.i4.2
L_0004: conv.i8
L_0005: stloc.1
L_0006: ldloc.0
L_0007: ldloc.1
L_0008: mul
L_0009: stloc.2
L_000a: ldloca.s num3
L_000c: call instance string int64::ToString()
L_0011: call void [mscorlib]System.Console::WriteLine(string)
L_0016: ret
}

Как видим, конвертация есть даже там, где я считал, её не будет. Так что доверяйте компилятору!


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 12.01.07 13:59
Оценка:
Под рукой студии нету. Попробуй вместо двойки взять скажем 35. Для двойки есть отдельная инструкция ldc.i4.2 похожей интсрукции ldc.i8.2 нету. Для чисел от 0 до 8 специнструкций не наблюдается, так что с 35 ему не удастся так легко отвертеться. В общем компилер наоптимизировал таки.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 12.01.07 14:22
Оценка:
Хм. Всетаки на интах не интересно проверять, думаю что для 35 и 35L все равно будет один и тот же код: ldc.i4 35 с последующим conv.i8 по одной простой причине, а именно оптимизация, эти две команды элементарно в байтах будут меньше чем ldc.i8 и дело даже не будет тут ни в каких литералах.

Интересные эксперименты:
static void Main(string[] args)
{
    const long x=35;
    const long xl=35L;

    int y=x;
    int yl=xl;
    
    Console.WriteLine((y * yl).ToString());
}


Будут ли тут лишние преобразования, можно еще попробовать с даблами, чтобы добиться явного вызова ToIn32 из литералов.

В общем нет никакого смысла ЯВНО указывать L после цифири, мозгов компилятору и своих хватает.

Хм. а интересно что он там накомпилирует на int x=100000L и int x=100000 будет хоть что-то отличаться?


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 12.01.07 16:07
Оценка:
Разве что в понедельник теперь.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 16.01.07 08:49
Оценка:
Попробовал добавлять нули. Мало что изменилось. Всё равно приводит в обоих случаях.
Попробовал с числами, не влезающими в Int32:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 2
.locals init (
[0] int64 num1,
[1] int64 num2,
[2] int64 num3)
L_0000: ldc.i8 200000000000
L_0009: stloc.0
L_000a: ldc.i8 200000000000
L_0013: stloc.1
L_0014: ldloc.0
L_0015: ldloc.1
L_0016: mul





данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 16.01.07 09:01
Оценка:
Начал доверять компилятору?


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 16.01.07 09:31
Оценка:
ZeeM:
Что то не могу разобраться.

есть два числа
byte a = 0x25;
byte b = 0x00;


мне необходимо преобразовать это в строку "250"

варианты типа:

string temp = a.ToString() + b.ToString(); не катят, т.к. получаются что байты сначала преобразуются в int. Как сделать это корректно?

Кстати, попробовал откомпилить исходное сообщение. Получилось вот что:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 2
.locals init (
[0] unsigned int8 num1,
[1] unsigned int8 num2,
[2] string text1)
L_0000: ldc.i4.s 37
L_0002: stloc.0
L_0003: ldc.i4.0
L_0004: stloc.1
L_0005: ldloca.s num1
L_0007: call instance string unsigned int8::ToString()
L_000c: ldloca.s num2
L_000e: call instance string unsigned int8::ToString()
L_0013: call string string::Concat(string, string)
L_0018: stloc.2
L_0019: ldloc.2
L_001a: call void [mscorlib]System.Console::WriteLine(string)
L_001f: ret
}

Видно, что байты хранятся в 4 байтовых ячейках. Но это нормально в 32-х разрядных системах.
-------------------------------------------------
2 ZeeM: 0x25 — это 37 в человеческой системе измерения. Поэтому (может, кто-то уже предлагал) надо делать правильное форматирование (http://msdn2.microsoft.com/en-us/library/dwhawy9k.aspx):
byte a = 0x25;
byte b = 0x00;

string temp = a.ToString("x") + b.ToString("x");
БУДЕТ КАК РАЗ ТО, ЧТО НУЖНО!
-------------------------------------------------
2 RuneLord:
С какой стати я должен ему доверять?
Microsoft редко делает что-то хорошее.
Как Ты делал человеческое форматирование кода в своём сообщении (цвета там, отступы)?


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 17.01.07 07:36
Оценка:
Ну скажем так, он все равно оптимизирует лучше чем я и качественнее и главное быстрее

Если постишь через gotdotnet, там есть четыре кнопки на тулбаре которые вставляют из клипборда C#, VB, SQL, XML


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.