LINUX.ORG.RU
ФорумTalks

TrueЪ времяисчисление


0

0

   Многие сталкиваются с неудобством стандартного
   времяисчисления.
   Хорошо, что мы, в общем то, можем его игнорировать.
   Но, тогда появляется вопрос: а как же ориентироваться во времени.
   Я попытался решить эту проблему.
   24 и 60 - некруглые числа и они нерулят. 86400 (кол-во секунд в сутках)
   тоже.
   Гораздо удобнее, когда в сутках 256 (0x00-0xff) часов по 256 минут.
   Это получается, (новых минут) 65536 (16 bit'ный счётчик).
   2-й, гораздо более спорный вопрос, ориентирование в днях и годах.
   Слишком уж далеки 365/366 от круглых 256 и 512.
   Но, деваться некуда. Берём 256.
   Отсчёт времени берём от стандартного UNIX времени.
   Итого, получаем:
   Код
   #include <stdio.h>
   #include <time.h>
   main ()
   {
     time_t tbox;
     long y, d, h, m;
     time (&tbox);
     tbox = tbox * 512 / 675;
     y = (long) tbox >> 24;
     tbox -= y << 24;
     d = (long) tbox >> 16;
     tbox -= d << 16;
     h = (long) tbox >> 8;
     tbox -= h << 8;
     m = (long) tbox;
     printf ("%x year, %x day, %x:%x\n", y, d, h, m);
   }
   Enjoy!
35 year, f8 day, b1:a5
★★★★★

А если ещё и применить мозг, то увидим, что есть вполне разумный вариант — 100000 секунд в сутки, 10 часов по 100 минут по 100 секунд, причём секунда почти такая же, как нынешняя. Жаль, что об этом своевременно французы не подумали, сейчас-то уже поздно...

Что касается количества дней в году, то это, знаете ли, объективная реальность, данная нам в ощущениях, и воевать с ней бесперспективно.

Teak ★★★★★
()

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

Секунда является единицой СИ, отсюда лучше и пляши. Например, сделав период бодрствования/сна в 65536 обычных секунд (3/4 обычного примерно) и забив на соответствие с обычным световым днём (кстати, у космонавтов он реально сокращается, как и у остальных изолированных обычно; так что организму будет даже лучше от этого). Или, например, в духе СИ можно назвать 1024 секунды кибисекундой.

anonymfus ★★★★
()
Ответ на: комментарий от anonymfus

«Секунда» — значит «вторая», обычно секундой называют второе деление некой базовой единицы (часа, углового градуса) на 60. В духе метрической системы заменяем архаичное деление на 60 делением на 100 и продолжаем пользоваться старым, хорошим термином.

Teak ★★★★★
()

а мне нравится твоя идея! :)

webster
()

так, кстати - где патч для ядра?

webster
()
Ответ на: комментарий от Teak

>Что касается количества дней в году, то это, знаете ли, объективная реальность, данная нам в ощущениях, и воевать с ней бесперспективно.

День и год - единственные реально обоснованные и важные для человека единицы измерения. Предлагаю считать время в дробных днях.

true
()

Ламир.

long y, d, h, m;
...
printf ("%x year, %x day, %x:%x\n", y, d, h, m);

Если sizeof(int) != sizeof(long), программа будет
работать некорректно.

anonymous
()
Ответ на: комментарий от anonymous

вобщем-то, да, но касается это прежде всего года (y). у d, h и m просто диапазон не выходит за рамки unsigned int.
да и у за рамки unsigned int выйдет очень не скоро.
а так можно и пофиксить:
[code]
...
  time_t tbox;
  unsigned int y, d, h, m;
  time (&tbox);
...
[/code]
---
что касается учёта времени в дробных днях, так, по сути, оно здесь и есть
а вот с кол-вом дней в году уже сложнее

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

>у d, h и m просто диапазон не выходит за рамки unsigned int

Какая разница, выходят или не выходят. На стеке будет лежать совсем не то, что ожидает printf, и распечатает он полную херню.

anonymous
()
Ответ на: комментарий от anonymous

>   Какая разница, выходят или не выходят. На стеке будет лежать совсем не
>   то, что ожидает printf, и распечатает он полную херню.
если быть абсолютно точным, это зависит от реализации представления данных и реализации printf
в случае gcc (естесственно, тестил у себя) грабель без выхода значений за рамки unsigned int (чего, естесственно, небыло) нет
а так, да, ошибка.
ЗЫ. погонял с искусственно созданными переполнениями. старшие биты срезаются - и всё
ЗЫ2. sizeof(unsigned int) == 4, sizeof(long) == 8, gcc 4.2.2

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от Shaman007

> По этому этим никто не пользуется.

пользуются производители жестких дисков :)

Adjkru ★★★★★
()
Ответ на: комментарий от saahriktu

> погонял с искусственно созданными переполнениями. старшие биты срезаются - и всё

Архитектура х86_64 (вы ведь на ней тестили?) такова, что положить в стек 4-байтную переменную невозможно, она расширяется до 8. На какой-нибудь другой машинной архитектуре всё может быть гораздо хуже. Мораль: не делайте так.

Relan ★★★★★
()
Ответ на: комментарий от Shaman007

> И это звучит одинаково идиотично на всех языках мира. По этому этим никто не пользуется.

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

Relan ★★★★★
()

На самом деле давно - до испытания прототипа транклюкатора^падения метеорита сутки на земле были другие - и равнялись сумме углов треугольника. Но потом у атлантов рванул самогонный аппарат и сутки укоротились и стали почти равны марсиянским. Хотя год у нас почти в два раза больше земного.

marsijanin ★★
()
Ответ на: комментарий от Relan

>Мораль: не делайте так.

На самом деле, мораль - не пользуйтесь С без крайней на то необходимости. Слишком опасный язычёк.

anonymous
()
Ответ на: комментарий от anonymous

Даже если взять unsigned int 32-х битной архитектуры, то этих 16 бит как раз достаточно для переменных d, h и m, а y максимально допустимого значения - 65536 - достигнет лишь к году так 47935 (по всемирному на данный момент календарю).
К тому времени разрядность процессоров будет позволять работать этой софтине и дальше.
Так что, да, ошибка, но не критическая. Гораздо более важным является "утечка памяти" - для этих 4-х переменных long'а в 2 раза более чем достаточно. потери памяти на момент работы программы составляют 8 байт на x86 и 16 байт на x86_64.
ЗЫ. насколько себя знаю, наибольшее кол-во ошибок, совершенных мной, связаны с указателями. поэтому, в первую очередь смотрю на них. а ошибок с типами данных за собой не припомню

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от anonymfus

Ударной волной от падения метеорита накрыло гигантский самогонный аппарат, использовавшийся атлантами для производства пойла в планетарных масштабах. Они спаивали драконов - дихлофос не помогал. Его взрыв вызвал изменение угловой скорости земли. А до этого в сутках было 360 градусов, или 21600 минут. Драконы с динозаврами и атлантами вымерли. Длинна суток изменилась, но отголоски древней системы счисления времени ещё живы.

marsijanin ★★
()
Ответ на: комментарий от saahriktu

>unsigned int 32-х битной архитектуры, то этих 16 бит как раз достаточно

sizeof(int) на x86/32бит == 4 == sizeof(long)

На 16 битных x86 sizeof(int) == 2, sizeof(long) == 4, причём команда процессора push кладёт на стек 2 байта. Там прога глюканёт конкретно. Если интересно как, проверь в эмуляторе.

anonymous
()
Ответ на: комментарий от saahriktu

Специально потестил на x86. Там проблема на момент пересчёта секунд. time_t слишком маленький. Старшие биты срезаются. Поэтому, результат неверный.
А так и с long'ом и unsigned int'ом полёт нормальный.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

патч для 32-х битных архитектур:
[code]
  time (&tbox);
  tbox = tbox * 0.7585185;
  y = (long) tbox >> 24;
[/code]

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от sskirtochenko

Да-да - обнаружена критическая уязвимость в атланской системе измерения времени - на отметке 40 градусов оно вначале течёт незаметно, а потом куда то исчезают целые часы и даже дни. Есть гипотеза, что метеорит ту не причём, просто атланты поюзали эту дыру во времени. Аппарат как раз причём.

marsijanin ★★
()
Ответ на: комментарий от true

>День и год - единственные реально обоснованные и важные для человека единицы измерения

А календари все цивилизации строили от нехрен делать.

Xellos ★★★★★
()
Ответ на: комментарий от marsijanin

>На самом деле давно - до испытания прототипа транклюкатора^падения метеорита сутки на земле были другие - и равнялись сумме углов треугольника.

Тогда сумма углов треугольника, по твоим словам, была 360 градусов. А сейчас 180 градусов. Получается, что свойства пространства фундаментально изменились. И это касется и Вас, марсиан, так же.

anonymfus ★★★★
()
Ответ на: комментарий от anonymfus

>Тогда сумма углов треугольника, по твоим словам, была 360 градусов. А сейчас 180 градусов.

180 - для двухмерного пространства.

marsijanin ★★
()
Ответ на: комментарий от Xellos

> А календари все цивилизации строили от нехрен делать.

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

Но для календаря есть хотя бы оправдание — деление года на 365/366 дней является данностью, и построить из этого что-то стройное и красивое сложновато. А вот для деления суток сначала на 24 куска, потом на 60, а потом ещё на 60 никакой рациональной причины нет. Это просто тяжёлое наследие прошлого. :)

Teak ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.