среда, 23 июля 2014 г.

Типы данных с плавающей точкой. Часть 2

По рекомендациям, заложенным в стандарт IEEE754 можно сконструировать дополнительные типы данных, часть из которых находит применение - fp24 (3 байта), fp16 (два байта), fp8 (один байт).

FP24 (s16e7)

бит знака, 7 бит порядка (смещение 63), 17 бит мантиссы (представляется 16 битами, 17 бит равен 1 для нормализованных и 0 для денормализованных чисел).

Emax = 63,  263 ≈ 9.223 1018Emin = -62,  2-62 ≈ 2.168 10-19
Макс. нормализованное число ≈ 1.845 1019 (1.11111...111 = 2 - 2-16 ≈ 2)
Мин. нормализованное число ≈ 2.168 10-19 (1.00000...000 * 2-62)
Макс. денормализовнное число ≈ 2.168 10-19 (0.1111...111 * 2-62 - для E=0 e = Emin = -62)
Мин. денормализованное число 2-74 ≈ 5.294 10-23 (0.0000..001 * 2-62 = 2-16 * 2-62)
Точность вычислений - 5 знаков ( log10(217) ≈ 5.118)


FP16 (s10e5)

бит знака, 5 бит порядка (смещение 15), 11 бит мантиссы (представляется 10 битами, 11 бит равен 1 для нормализованных и 0 для денормализованных чисел).

Emax = 15,  215 = 32768,  Emin -14,  2-14 = 6.103 10-5

Макс. нормализованное число = 65504 (1.11111...111 = 2 - 2-10)
Мин. нормализованное число = 6.103515625 * 10-5 (1.00000...000 * 2-14)
Макс. денормализовнное число ≈ 6.098 10-5 (0.1111...111 * 2-14 - для E=0 e = Emin = -14)
Мин. денормализованное число 2-24 ≈ 5.96 10-8
Точность вычислений - 3 знака ( log10(215) ≈ 3.311)


FP8 (s3e4, minifloat)

бит знака, 4 бита порядка (смещение 7), 4 бита мантиссы (представляется 3 битами, равен 1 для нормализованных и 0 для денормализованных чисел).


Emax 27 = 128, Emin 2-6 = 0.015625
Макс. нормализованное число 27 * 1.111 = 240
Мин. нормализованное число 2-6 * 1.000 = 0.015625
Макс. денормализовнное число 2-6 * 0.111 = 0.013671875
Мин. денормализованное число 2-6 * 0.001 = 0,001953125
Точность вычислений - 1 знак ( log10(24) ≈ 1.204)

вторник, 22 июля 2014 г.

Типы данных с плавающей точкой. Часть 1

Официально поддерживаемыми в Си являются следующие типы данных с плавающей точкой:

float (точность - 32 бит, sizeof(float) = 4)
double (точность - 64 бит, sizeof(double) = 8)
и плохо поддерживаемый long double (точность - 80 бит, sizeof(long dobule) = 12).


float (или single

бит знака, 8 бит порядка (со смещением 127), 24 бита мантиссы (представляется 23 битами, 24 подразумевается равным 1 для нормализованных чисел и 0 для денормализованных).

Emax = 127,  2127 ≈ 1.7 1038, Emin = -126,  2-126 ≈ 1.17 10-38.
Макс. нормализованное число ≈ 3.4 1038 (1.11111...111 = 2 - 2-23 ≈ 2)
Мин. нормализованное число ≈ 1.17 10-38 (1.00000...000 * 2-126)  
Макс. денормализованное число ≈ 1.17 10-38 (0.1111...111 * 2-126 - для E=0 e = Emin - -126)
Мин. денормализованное число  2-149 ≈ 1.4 10-45 (0.0000..001 * 2-126 = 2-23 * 2-126)
Точность вычислений - 7 знаков ( log10(224) ≈ 7.225)


double

бит знака, 11 бит порядка (со смещенем 1023), 53 бита мантиссы (представляется 52 битами, подразумевается 1 для нормализованных и 0 для денормализованных чисел).

Emax = 1023,  21023 ≈ 8.988 10307Emin = -1022,  2-1022 ≈ 2.225 10-308.
Макс. нормализованное число ≈ 1.798 10308 (1.11111...111 = 2 - 2-52 ≈ 2)
Мин. нормализованное число ≈ 2.225 10-308 (1.00000...000 * 2-1022)  
Макс. денормализованное число ≈ 2.225 10-308 (0.1111...111 * 2-1022 - для E = 0 e = Emin - -1022)
Мин. денормализованное число  2-1074 ≈ 4.940 10-324 (0.000...001 * 2-1022 = 2-52 * 2-1022)
Точность вычислений - 15 знаков ( log10(253) ≈ 15.954)

extended

бит знака, 15 бит порядка (со смещенем 16383), 64 бита мантиссы (представляется всеми 64 битами, первый бит равен 1 для нормализованных и 0 для денормализованных чисел).

 Emax = 16383,  216383 ≈ 5.949 104931Emin = -16382,  2-16382 ≈ 3.362 10-4932.
Макс. нормализованное число ≈ 1.190 104932 (1.11111...111 = 2 - 2-63 ≈ 2)
Мин. нормализованное число ≈ 3.362 10-4932 (1.00000...000 * 2-16382)  
Макс. денормализованное число ≈ 3.362 10-4932 (0.1111...111 * 2-16382 - для E = 0 e = Emin - -16382)
Мин. денормализованное число  2-16445 ≈ 3.645 10-4951 (0.000...001 * 2-16382 = 2-63 * 2-16382)
Точность вычислений - 19 знаков ( log10(264) ≈ 19.266)

пятница, 18 июля 2014 г.

Замер результатов выполнения команды

Замер времени в Си

#include <stdio.h>
#include <time.h>

clock_t start, diff;
int        msec;

int main() {

    start = clock();
    // Do something
    msec = diff * 1000 / CLOCKS_PER_SEC;
    printf("Time taken %d seconds %d milliseconds\n", 

            msec/1000, msec%1000);
}


Замер времени в JavaScript


console.Time("name");    // создание таймера с именем "Name"
// Do something
console.TimeEnd("name"); // завершение таймера "name" и вывод
                         // результатов замера

четверг, 17 июля 2014 г.

Вещественные числа в формате IEEE-754

Любое вещественное число с плавающей точкой можно представить в формате

(-1)s basee mantiss

где s - знак (0 - положительный, 1 - отрицательный);
       base - основание (система счисления, в которой представляется число, чаще всего 2 или 10);
       e - экспонента (порядок, показатель степени).
       mantiss - мантисса.

Мантисса нормализуется так, чтобы представлять собой число с плавающей точкой для которого выполняется условие: 1 <= m < b.


Для десятичной системы счисления первый разряд мантиссы находится в диапазоне от 1 до 9, для двоичного, соответственно, только 1, поэтому его можно всегда опускать, тем самым увеличивая разрядность мантиссы на 1:

123.45610 = 1.23456 * 102
0.12345610 = 1.23456 * 10-2
11101.012 = 1.110101 * 24 - для мантиссы достаточно 6 бит, т.к. первый всегда равен 1.
0.0011101012 = 1.110101 * 2-3

Представление числа с плавающей точкой в двоичном виде:


Реальная точность мантиссы - n+1 бит. 

Экспонента представляется в смещенном виде. Величина смещения рассчитывается по формуле offset = 2b-1 - 1. Для b = 8 бит (single) offset = 127, для b = 11 бит (double) offset = 1023.

Значения, состоящие из одних нулей (E = 0) и одних единиц (E = 2b-1) зарезервированы для специальных применений.
Максимальная возможная экспонента Emax представима как 2b-1 и равняется offset.
Минимальная возможная экспонента Emin представима как 1 и равняется -(offset - 1).

Emin для 8 бит = -126, для 11 бит = -1022, Emax для 8 бит = 127, для 11 бит = 1023.

Специальные случаи:

E = 0 (одни нули), M = 0 (одни нули), S = 0: положительный 0 (+0).
E = 0 (одни нули), M = 0 (одни нули), S = 1: отрицательный 0 (-0).

E = 0 (одни нули), M = любое значение (кроме одних нулей, чтобы не путать с положительным и отрицательным нулями), S = любое значение: денормализованные числа.

E = 2b-1 (одни единицы), M = 0 (одни нули), S = 0 представляет собой
E = 2b-1 (одни единицы), M = 0 (одни нули), S = 1 представляет собой -∞

E = 2b-1 (одни единицы), M = 1xx...xxx (первый знак - 1), S - любое: quiet NaN (qNaN)
E = 2b-1 (одни единицы), M = 0xx...xxx (первый знак - 0, остальные - хотя бы одна единица, чтобы не совпало с ), S - любое: signalling NaN (sNaN)


понедельник, 7 июля 2014 г.

Печать на старых принтерах с 64х-битных систем.

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

Принтер подключается к 32-битной Windows XP для которой драйвер, скорее всего, есть (хотя бы и для Windows 2000 - 1999 год выпуска). Теоретически, может подойти и машина с Windows 95/98.

На принт-сервере нужно установить GhostScript, GhostView и Redmon - программа перенаправления портов печати, а также оригинальные драйверы для принтера. Схема такая:

х64-система ведет печать на принтер PostScript, доступный по сети. х32-система получает данные для печати в PostScript формате, GhostScript растрирует их и отправляет при помощи RedMon на локальный принтер, драйверы для которого в наличии есть.

При установке виртуального принтера на принт-сервере нужно в качестве порта указать порт RedMon - RPT1. Принтер с принт-сервера расшаривается и ставится как сетевой на х64-системе. Драйверы должны быть для одного и того же принтера. Например HP Color Laserjet 2800 Series PS для Windows 7 x64 и HP Color Laserjet PS для XP32.

Подробнее здесь и здесь.

Мелочи хостинга

При переносе старых проектов на новые серверы может возникнуть ряд проблем, связанных с обновлениями форматов конфигурационных файлов или упразднение устаревших возможностей.

http://httpd.apache.org/docs/2.4/upgrading.html - здесь описание изменений в конфигурации Apache 2.4. Вкратце:
Order allow, deny 
Allow from all 
заменили на 
Require all granted (внимание, регистр!)
Аналогично Require all denied 
Иначе может приводить к возникновению 500х ошибок.

В php 5.4 может вылезти ошибка PHP Fatal error: Call-time pass-by-reference has been removed (ранее просто deprecated, правилось установкой соответствующего флага в конфиге). Лечится заменой &$ на $ в именах переменных.


Отслеживание ошибок, вставляем в код: 
error_reporting(E_ALL); 
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
 
После установки Firebird нужно установить пароль root:
sudo dpkg-reconfigure firebird2.1-classic

PHP-модуль Interbase не активируется автоматически.
php5enmod interbase
apache2ctl restart

воскресенье, 6 июля 2014 г.

Основы SSL

Включаем SSL в Apache:
a2enmod ssl
a2ensite default-ssl
service apache2 restart

MariaDB и все-все-все.

MariaDB с т. зрения системного администрирования ничем не отличается от MySQL (за исключением имен установочных пакетов, пожалуй).

Меняем пароль рута (по умолчанию не установлен):
mysqladmin -u root password newpass

Проверяем версию установленной БД:
mysql -e 'show global variables like "version";' -u root -p

При установке phpMyAdmin соглашаемся с его предложением о разрешении зависимостей (не устанавливать клиент MySQL) и настраиваем доступ к сокету БД.
dpkg-reconfigure phpmyadmin

В версии 14.10 еще не исправили зависимости ряда пакетов, поэтому при установке они могут требовать mysql. С postfixadmin пришлось ковыряться руками.

Параметры, отвечающие за загрузку файлов:

post_max_size
upload_max_filesize (def 2M)
memory_limit (def 128M)

 

Обсустраиваем работу в консоли. Bash и MC.

Шкурка для Midnight Commander на 256 цветов. Xterm-256color не работает с tmux (точнее, работает с артефактами).

.bashrc: TERM=screen-256color
.config/mc/ini: skin=default заменить на skin=xoria256

Работающая мышь в Midnight Commander в 256-цветном терминале.

.bashrc: alias mc='mc -x'


По умолчанию после создания сессии выполняется только профиль .profile, а файл настроек .bashrc запускается при последующих запусках bash (вручную или внутри MC). Для этого принудительно выполняем .bashrc, записав в

.profile: 
if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi


четверг, 3 июля 2014 г.

Nano: подсветка синтаксиса конфигурационных файлов.

Создаем файл /usr/share/config.nanorc следующего содержания:

# config file highlighting 
syntax "conf" "(\.([A-Za-z0-9])*(rc)$)|(\.(conf|config|cfg|cnf|profile|lst|list|defs|ini|desktop|mime|types|preset|cache|seat|service|htaccess)$|(^|/)(\w*crontab|mirrorlist|group|hosts|passwd|rpc|netconfig|shadow|fstab|inittab|inputrc|protocols|sudoers)$|conf.d/|.config/)" 
# default text 
color magenta "^.*$" 
# special values 
icolor brightblue "(^|\s|=)(default|true|false|on|off|yes|no)(\s|$)" # keys 
icolor cyan "^\s*(set\s+)?[A-Z0-9_\/\.\%\@+-]+\s*([:]|\>)" 
# commands 
color blue "^\s*set\s+\<" 
# punctuation 
color blue "[.]" 
# numbers 
color red "(^|\s|[[/:|<>(){}=,]|\])[-+]?[0-9](\.?[0-9])*%?($|\>)" 
# keys 
icolor cyan "^\s*(\$if )?([A-Z0-9_\/\.\%\@+-]|\s)+=" 
# punctuation 
color blue "/" 
color brightwhite "(\]|[()<>[{},;:=])" 
color brightwhite "(^|\[|\{|\:)\s*-(\s|$)" 
# section headings 
icolor brightyellow "^\s*(\[([A-Z0-9_\.-]|\s)+\])+\s*$" 
color brightcyan "^\s*((Sub)?Section\s*(=|\>)|End(Sub)?Section\s*$)" color brightcyan "^\s*\$(end)?if(\s|$)" 
# URLs 
icolor green "\b(([A-Z]+://|www[.])[A-Z0-9/:#?&$=_\.\-]+)(\b|$| )" 
# XML-like tags 
icolor brightcyan "</?\w+((\s*\w+\s*=)?\s*("[^"]*"|'[^']*'|!?[A-Z0-9_:/]))*(\s*/)?>" 
# strings 
color yellow "\"(\\.|[^"])*\"" "'(\\.|[^'])*'" 
# comments 
color white "#.*$" 
color blue "^\s*##.*$" 
color white "^;.*$" 
color white start="<!--" end="-->"

И ссылаемся на него в конфиге нано (.nanorc)
include "/usr/share/nano/config.nanorc"

set autoindent  #автоотступ последующих строк как у предыдущих
set smarthome   #автовозврат к первому значимому символу строки
set const       #показ номера текущей строки и позиции в строке

 

Обустраиваем работу в консоли. Byobu

Byobu - замечательная надстройка для screen/tmux, позволяющая управлять множеством одновременных сессий, не прерывающихся при обрыве связи. Must-have для консоли.

После установки возникает целый ряд проблем. 

Перехват функциональных клавиш:
для Screen - .byobu/keybindings:  
source $BYOBU_PREFIX/share/byobu/keybindings/f-keys.screen.disable
для tmux - .byobu/keybindings.tmux:   
source $BYOBU_PREFIX/share/byobu/keybindings/f-keys.tmux.disable