Вот реализация, подходящая для ветвлений:
inline int signum(const double x) {
if(x == 0) return 0;
return (1 - (static_cast((*reinterpret_cast(&x)) >> 63) << 1));
}
Если ваши данные не имеют нулей в качестве половины чисел, здесь предиктор ветвлений выберет одну из ветвей в качестве наиболее распространенной. Обе ветви включают только простые операции.
В качестве альтернативы, на некоторых компиляторах и архитектурах ЦП версия без ответвлений может быть быстрее:
inline int signum(const double x) {
return (x != 0) *
(1 - (static_cast((*reinterpret_cast(&x)) >> 63) << 1));
}
Это работает для двоичного формата двойной точности с плавающей точкой IEEE 754: binary64 .
Нет, на самом деле сейчас нет мобильных ОС для телефонов Nokia. Ubuntu будет поддерживаться для устройств Android. И сейчас Ubuntu Touch доступен только на устройствах Google Nexus. Да, в Ubuntu touch есть магазин приложений. Он новый, поэтому для включения максимального количества приложений потребуется некоторое время.
Для Ubuntu и Android требуется другое оборудование, чем для телефонов Nokia, и принудительная установка других ОС на устройствах Nokia может привести к поломке устройства. Nokia ничего не разрабатывает, потому что они не позволяют устанавливать другие ОС в Nokia.