Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.07.2012, 21:55   #21
mrMeerkat
Следопыт
Форумчанин
 
Аватар для mrMeerkat
 
Регистрация: 26.04.2012
Сообщений: 307
По умолчанию

Гм, vb.nete иногда грешу конструкциями типа
Dim a as IntPtr = IIf(b>c, vbNull, IntPtr.Zero)

Или переменные обьявляю:
int? i = null;

Ну это так.
Реально достали ограничения языка программирования, через которые приходится переступать
С Баша:Быть ленивым, глупым, жадным, да и просто редкостным гандоном и мудаком по жизни номально, а вот если ты матом ругаешься-то это да, ужасно и достойно общественного порицания.

Последний раз редактировалось mrMeerkat; 28.07.2012 в 22:03.
mrMeerkat вне форума Ответить с цитированием
Старый 19.09.2012, 14:21   #22
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Внимание, вопрос.

Код:
using System;

class Program
{
	static void Main()
	{
		double a = double.MaxValue;
		double b = double.MaxValue;
		Console.WriteLine((a + b) / 2);
		Console.ReadKey();
	}
}
На платформе x86 эта программа выдаёт 1.79769313486232E+308, а на x64 - Infinity. Почему?

Особая благодарность тому, кто скажет, что программа выдаст на Itanium.
ds.Dante вне форума Ответить с цитированием
Старый 19.09.2012, 14:23   #23
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Потому что надо пользоваться длинной арифметикой. И никаких проблем не возникнет.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 19.09.2012, 14:53   #24
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Это не проблема, это вопрос на знание платформы.
ds.Dante вне форума Ответить с цитированием
Старый 20.09.2012, 10:47   #25
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

И какой же ответ?
m0nax вне форума Ответить с цитированием
Старый 20.09.2012, 19:59   #26
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

А я надеялся, что кто-нибудь не поленится поковыряться с дизассемблером и в спецификациях...

Есть два основных механизма работы с дробными числами - сопроцессор x87 и набор инструкций SSE.
- x87 появился в 1980-м году и присутствует даже в допотопных 16-битных 8086. Он имеет избыточную 80-битную разрядность.
- SSE (32-битный) появился в 1999-м, а SSE2 (64-битный) - в 2001-м году, поэтому они есть не во всех 32-битных процессорах (но во всех 64-битных). Зато они быстрее, благодаря тому, что могут обрабатывать сразу несколько чисел одной операцией.

В итоге x64 jitter использует быстрый SSE, а x86 jitter ради совместимости использует 80-битный x87 FPU. Поэтому при компиляции под x86 операция double.MaxValue * 2 не вызовет переполнения, пока программа не попытается записать эту величину в переменную double. Этого может и не случиться, потму что спецификация CLI (см. стр. 75) позволяет использовать внутреннее представление вещественных чисел, и требует приведения к float32/float64 только при фактической записи величины в поле класса. При использовании SSE2 переполнение происходит всегда, поэтому мы в любом случае получим Infinity.

Последний раз редактировалось ds.Dante; 20.09.2012 в 20:04.
ds.Dante вне форума Ответить с цитированием
Старый 22.09.2012, 01:14   #27
mrMeerkat
Следопыт
Форумчанин
 
Аватар для mrMeerkat
 
Регистрация: 26.04.2012
Сообщений: 307
По умолчанию

Уважаемый ds.Dante, вы при создании темы какой вопрос задали?
"В каком случае необходимо писать if (flag == true) вместо if (flag)?"
Это зависит от ЯП.

Так как тема находится в разделе .NET: я писал бы
flag = (z=true AND q=false)
на vb.net.

Цитата:
Поэтому при компиляции под x86 операция double.MaxValue * 2 не вызовет переполнения
Используйте вместо " * 2 " - "<<1", быстрее будет исполняться.

ЗЫ: может и не прав, добью уже свой профиль.
С Баша:Быть ленивым, глупым, жадным, да и просто редкостным гандоном и мудаком по жизни номально, а вот если ты матом ругаешься-то это да, ужасно и достойно общественного порицания.
mrMeerkat вне форума Ответить с цитированием
Старый 22.09.2012, 01:31   #28
mrMeerkat
Следопыт
Форумчанин
 
Аватар для mrMeerkat
 
Регистрация: 26.04.2012
Сообщений: 307
По умолчанию

Дополню:

Цитата:
Сообщение от ds.Dante Посмотреть сообщение
А я надеялся, что кто-нибудь не поленится поковыряться с дизассемблером и в спецификациях...
С Ildasm или Reflector?
Тема то в разделе про .NET?
Какие дизасемблеры и математические сопроцессоры?
С Баша:Быть ленивым, глупым, жадным, да и просто редкостным гандоном и мудаком по жизни номально, а вот если ты матом ругаешься-то это да, ужасно и достойно общественного порицания.
mrMeerkat вне форума Ответить с цитированием
Старый 22.09.2012, 06:59   #29
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Цитата:
Сообщение от mrMeerkat Посмотреть сообщение
Так как тема находится в разделе .NET: я писал бы
flag = (z=true AND q=false)
на vb.net.
Я точно не помню, почему задал вопрос именно в этом разделе. Кажется, потому что здесь гораздо меньше студентов с лабораторными.

Цитата:
Сообщение от mrMeerkat Посмотреть сообщение
Используйте вместо " * 2 " - "<<1", быстрее будет исполняться.
Это только для целочисленных. Да и для них не будет работать быстрее - оба варианта jitter скомпилирует в одно и то же:
Код:
mov ecx,dword ptr [rsp+20h]
add ecx,ecx
Цитата:
Сообщение от mrMeerkat Посмотреть сообщение
С Ildasm или Reflector?
Я использовал ILDasm и Debug->Windows->Disassembly. Кстати, IL практически не зависит ни от x86/x64, ни от Debug/Release, ни от float/double. Существенные отличия возникают только в машинном коде.

Цитата:
Сообщение от mrMeerkat Посмотреть сообщение
Тема то в разделе про .NET?
Какие дизасемблеры и математические сопроцессоры?
Ключевой момент всё-таки в том, что для разных платформ jitter использует разные механизмы работы с вещественными числами, поэтому вопрос про .NET. Таков закон дырявых абстракций: даже в дотнете мы периодически натыкаемся на особенности процессоров и прочие низкоуровневости.

Последний раз редактировалось ds.Dante; 22.09.2012 в 07:15.
ds.Dante вне форума Ответить с цитированием
Старый 23.12.2013, 18:34   #30
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Очередной вопрос.

Код:
using System;

class Program
{
    static void Main()
    {
        int x = ...
        Console.Write(x == -x);
    }
}
Чему должно быть равно x, чтобы программа выдала "True"? Есть два варианта.

Последний раз редактировалось ds.Dante; 24.12.2013 в 00:51.
ds.Dante вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопрос на засыпку по show columns smoke888 SQL, базы данных 5 17.09.2012 12:46
Вопрос на засыпку mnbvcxz13 Свободное общение 3 09.11.2011 18:36
вопрос на засыпку...... Rukata Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 19.09.2009 23:39
Вопрос на засыпку BuT@JL Помощь студентам 6 08.03.2009 12:56