Я должен использовать дважды или плавание?

Работает на всех версиях Android:

String[] TO = {"email@server.com"};
    Uri uri = Uri.parse("mailto:email@server.com")
            .buildUpon()
            .appendQueryParameter("subject", "subject")
            .appendQueryParameter("body", "body")
            .build();
    Intent emailIntent = new Intent(Intent.ACTION_SENDTO, uri);
    emailIntent.putExtra(Intent.EXTRA_EMAIL, TO);
    startActivity(Intent.createChooser(emailIntent, "Send mail..."));
80
задан mskfisher 9 May 2012 в 16:25
поделиться

11 ответов

If you want to know the true answer, you should read What Every Computer Scientist Should Know About Floating-Point Arithmetic.

In short, although double allows for higher precision in its representation, for certain calculations it would produce larger errors. The "right" choice is: use as much precision as you need but not more and choose the right algorithm.

Many compilers do extended floating point math in "non-strict" mode anyway (i.e. use a wider floating point type available in hardware, e.g. 80-bits and 128-bits floating), this should be taken into account as well. In practice, you can hardly see any difference in speed -- they are natives to hardware anyway.

98
ответ дан 24 November 2019 в 09:49
поделиться

На этот вопрос невозможно ответить, так как у вопроса нет контекста. Вот несколько вещей, которые могут повлиять на выбор:

  1. Реализация компилятором чисел с плавающей запятой, чисел двойной точности и длинных чисел двойной точности. Стандарт C ++ гласит:

    Существует три типа с плавающей запятой: float, double и long double. Тип double обеспечивает как минимум такую ​​же точность, как float, а тип long double обеспечивает как минимум такую ​​же точность, как и double.

    Итак, все три могут иметь одинаковый размер в памяти.

  2. Наличие FPU. Не все ЦП имеют FPU, и иногда типы с плавающей запятой эмулируются, а иногда типы с плавающей запятой просто не поддерживаются.

  3. Архитектура FPU. FPU IA32 внутренне 80-битный - 32-битные и 64-битные числа с плавающей запятой расширяются до 80 бит при загрузке и уменьшаются при хранении. Там' s также SIMD, который может выполнять четыре 32-битных или два 64-битных поплавка параллельно. Использование SIMD не определено в стандарте, поэтому потребуется компилятор, который выполняет более сложный анализ, чтобы определить, можно ли использовать SIMD, или требует использования специальных функций (библиотек или встроенных функций). Результатом 80-битного внутреннего формата является то, что вы можете получить несколько разные результаты в зависимости от того, как часто данные сохраняются в ОЗУ (таким образом, теряя точность). По этой причине компиляторы не очень хорошо оптимизируют код с плавающей запятой.

  4. Пропускная способность памяти. Если для числа double требуется больше памяти, чем для числа с плавающей запятой, чтение данных займет больше времени. Это наивный ответ. На современном IA32 все зависит от того, откуда берутся данные. Если он находится в кэше L1, нагрузка незначительна при условии, что данные поступают из одной строки кеша. Если он занимает более одной строки кэша, возникают небольшие накладные расходы. Если он из L2, это займет немного больше времени, если он в ОЗУ, то еще дольше и, наконец, если он на диске, это огромное время. Таким образом, выбор типа float или double менее важен, чем способ использования данных. Если вы хотите выполнить небольшой расчет на большом количестве последовательных данных, предпочтительнее использовать небольшой тип данных. Выполнение большого количества вычислений на небольшом наборе данных позволит вам использовать большие типы данных со значительным эффектом. Если вы обращаетесь к данным очень случайным образом, выбор размера данных не имеет значения - данные загружаются в страницы / строки кэша. Таким образом, даже если вам нужен только байт из ОЗУ, вы можете передать 32 байта (это очень зависит от архитектуры системы). Вдобавок ко всему, CPU / FPU может быть суперскалярным (то есть конвейерным). Так, даже несмотря на то, что загрузка может занять несколько циклов, CPU / FPU может быть занят чем-то другим (например, умножением), что в некоторой степени скрывает время загрузки.

  5. Стандарт не предписывает какой-либо конкретный формат для значений с плавающей запятой.

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

27
ответ дан 24 November 2019 в 09:49
поделиться

Double является более точным, но кодируется 8 байтами. float всего 4 байта, поэтому меньше места и меньше точности.

Вы должны быть очень осторожны, если в вашем приложении есть double и float. У меня была ошибка из-за этого в прошлом. Одна часть кода использовала float, а остальная часть кода использовала double. Копирование double в float, а затем float в double может вызвать ошибку точности, которая может иметь большое влияние. В моем случае это был химический завод ... надеюсь, это не имело драматических последствий:)

Я думаю, что именно из-за такого рода ошибок несколько лет назад взорвалась ракета Ariane 6 !!!

Тщательно подумайте о типе, который будет использоваться для переменной

15
ответ дан 24 November 2019 в 09:49
поделиться

Это зависит от того, как компилятор реализует double. Допустимо, чтобы double и float были одного и того же типа (и это есть в некоторых системах).

При этом, если они действительно разные, то главный вопрос - точность. Двойник имеет гораздо более высокую точность из-за разницы в размере. Если используемые вами числа обычно превышают значение числа с плавающей запятой, используйте число типа double.

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

4
ответ дан 24 November 2019 в 09:49
поделиться

Используйте ту точность, которая требуется для достижения соответствующих результатов . Если после этого вы обнаружите, что ваш код работает не так хорошо, как хотелось бы (вы правильно использовали профилирование?), Взгляните на:

3
ответ дан 24 November 2019 в 09:49
поделиться

I think regardless of the differences (which as everyone points out, floats take up less space and are in general faster)... does anyone ever suffer performance issues using double? I say use double... and if later on you decide "wow, this is really slow"... find your performance bottleneck (which is probably not the fact you used double). THEN, if it's still too slow for you, see where you can sacrifice some precision and use float.

2
ответ дан 24 November 2019 в 09:49
поделиться

Лично я все время иду на удвоение, пока не вижу узких мест. Затем я подумываю о переходе на плавающую или оптимизацию какой-либо другой части

6
ответ дан 24 November 2019 в 09:49
поделиться

Основное различие между float и double - точность. В Википедии есть больше информации о одинарная точность (с плавающей запятой) и двойная точность .

1
ответ дан 24 November 2019 в 09:49
поделиться

Это сильно зависит от ЦП. Наиболее очевидный компромисс между точностью и памятью. С гигабайтами ОЗУ память не представляет большой проблемы, поэтому обычно лучше использовать double s.

Что касается производительности, она сильно зависит от процессора. float обычно имеют лучшую производительность, чем double s на 32-битной машине. В 64-битных системах double иногда быстрее, поскольку это (обычно) собственный размер. Тем не менее, гораздо больше, чем ваш выбор типов данных, будет иметь значение, сможете ли вы воспользоваться инструкциями SIMD на своем процессоре.

1
ответ дан 24 November 2019 в 09:49
поделиться

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

0
ответ дан 24 November 2019 в 09:49
поделиться

Unless you have some specific reason to do otherwise, use double.

Perhaps surprisingly, it is double and not float that is the "normal" floating-point type in C (and C++). The standard math functions such as sin and log take doubles as arguments, and return doubles. A normal floating-point literal, as when you write 3.14 in your program, has the type double. Not float.

On typical modern computers, doubles can be just as fast as floats, or even faster, so performance is usually not a factor to consider, even for large calculations. (And those would have to be large calculations, or performance shouldn't even enter your mind. My new i7 desktop computer can do six billion multiplications of doubles in one second.)

39
ответ дан 24 November 2019 в 09:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: