Skip to content

Commit 18c5c88

Browse files
committed
Fix custom time output not to use 1eN format
Use %f instead of %g; plutoday was rendered as '6 d + 09:16:5e+01 s'. Also, ndig needs adjusting via log10, not log2.
1 parent 75df7e3 commit 18c5c88

2 files changed

Lines changed: 121 additions & 109 deletions

File tree

expected/time.out

Lines changed: 102 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -161,108 +161,108 @@ SELECT '1.1 d'::unit; -- needs ULP clamping
161161
(1 row)
162162

163163
SELECT name, unit, definition FROM unit_units WHERE dimension(unit) = 'TIME' ORDER BY unit, name;
164-
name | unit | definition
165-
------------------+--------------------------------------------------+-----------------------------------------------
166-
plancktime | 5.39105895420117e-44 s | hbar / planckmass c^2
167-
t_P | 5.39105895420117e-44 s | plancktime
168-
atomictime | 24.188843266026 as | hbar^3/coulombconst^2 atomicmass e^4
169-
svedberg | 100 fs | 1e-13 s
170-
㎰ | 1 ps | ps
171-
㎱ | 1 ns | ns
172-
shake | 10 ns | 1e-8 sec
173-
㎲ | 1 µs | µs
174-
㎳ | 1 ms | ms
175-
jiffies | 10 ms | jiffy
176-
jiffy | 10 ms | 0.01 sec
177-
timeatom | 159.574468085106 ms | 1|47 timeounce
178-
Tim | 173.611111111111 ms | 12^-4 hour
179-
blink | 864 ms | 1e-5 day
180-
decimalsecond | 864 ms | 1|100 decimalminute
181-
siderealsecond | 997.269566435185 ms | 1|60 siderealminute
182-
s | 1 s | s
183-
sec | 1 s | s
184-
second | 1 s | s
185-
TIME | 1 s | second
186-
timeounce | 7.5 s | 1|8 timeostent
187-
siderealminute | 59.8361739861111 s | 1|60 siderealhour
188-
min | 00:01:00 s | minute
189-
minute | 00:01:00 s | 60 s
190-
timeostent | 00:01:00 s | 1|60 hour
191-
beat | 00:01:26.4 s | decimalminute
192-
decimalminute | 00:01:26.4 s | 1|100 decimalhour
193-
timeminute | 00:06:00 s | 1|10 hour
194-
timepoint | 00:12:00 s | 1|5 hour
195-
ce | 00:14:24 s | 1e-2 day
196-
bell | 00:30:00 s | 1|8 watch
197-
lunour | 00:59:03.67055556 s | 1|24 lune
198-
siderealhour | 00:59:50.1704392 s | 1|24 siderealday
199-
h | 01:00:00 s | hour
200-
hour | 01:00:00 s | 60 min
201-
hr | 01:00:00 s | hour
202-
decimalhour | 02:24:00 s | 1|10 day
203-
watch | 04:00:00 s | 4 hours
204-
jupiterday | 09:55:29.856 s | 0.41354 day
205-
saturnday | 10:30:00 s | 0.4375 day
206-
uranusday | 15:36:00 s | 0.65 day
207-
neptuneday | 18:25:55.2 s | 0.768 day
208-
lune | 23:37:28.09 s | 1|30 lunation
209-
earthday | 23:56:04.091 s | siderealday
210-
siderealday | 23:56:04.091 s | 86164.09054 s
211-
㍲ | 1 d | da
212-
d | 1 d | day
213-
da | 1 d | day
214-
day | 1 d | 24 hr
215-
marsday | 1 d + 00:37:22.66 s | 1.02595675 day
216-
plutoday | 6 d + 09:16:5e+01 s | 6.3867 day
217-
sennight | 7 d | 7 day
218-
week | 7 d | 7 day
219-
wk | 7 d | week
220-
fortnight | 14 d | 14 day
221-
draconicmonth | 27 d + 05:05:4e+01 s | nodicalmonth
222-
draconiticmonth | 27 d + 05:05:4e+01 s | nodicalmonth
223-
nodicalmonth | 27 d + 05:05:4e+01 s | 27.2122199 day
224-
siderealmonth | 27 d + 07:43:1e+01 s | 27.321661 day
225-
anomalisticmonth | 27 d + 13:18:3e+01 s | 27.55454977 day
226-
islamicmonth | 29 d + 12:00:00 s | 1|12 islamicyear
227-
lunarmonth | 29 d + 12:44:03 s | 29 days + 12 hours + 44 minutes + 2.8 seconds
228-
lunation | 29 d + 12:44:03 s | synodicmonth
229-
synodicmonth | 29 d + 12:44:03 s | lunarmonth
230-
mo | 30 d + 10:29:04 s | month
231-
month | 30 d + 10:29:04 s | 1|12 year
232-
mercuryday | 58 d + 15:30:31.68 s | 58.6462 day
233-
mercuryyear | 87 d + 23:15:43.8199 s | 0.2408467 julianyear
234-
venusyear | 224 d + 16:49:09.05218 s | 0.61519726 julianyear
235-
venusday | 243 d + 00:14:24 s | 243.01 day
236-
eclipseyear | 346 d + 14:52:48 s | 346.62 days
237-
islamicyear | 354 d | 354 day
238-
lunaryear | 354 d + 08:48:33.6 s | 12 lunarmonth
239-
islamicleapyear | 355 d | 355 day
240-
calendaryear | 1 commonyear | 365 day
241-
commonyear | 1 commonyear | 365 day
242-
solaryear | 1 commonyear + 05:48:45.9747 s | year
243-
tropicalyear | 1 commonyear + 05:48:45.9747 s | 365.242198781 day
244-
year | 1 commonyear + 05:48:45.9747 s | tropicalyear
245-
yr | 1 commonyear + 05:48:45.9747 s | year
246-
gregorianyear | 1 commonyear + 05:49:12 s | 365.2425 day
247-
julianyear | 1 commonyear + 06:00:00 s | 365.25 day
248-
earthyear | 1 commonyear + 06:09:09.54003 s | siderealyear
249-
siderealyear | 1 commonyear + 06:09:09.54003 s | 365.256360417 day
250-
gaussianyear | 1 commonyear + 06:09:56.0154 s | (2 pi / gauss_k) days
251-
anomalisticyear | 1 commonyear + 06:13:49.44 s | 365.2596 days
252-
leapyear | 1 commonyear + 1 d | 366 day
253-
marsyear | 1 commonyear + 321 d + 23:30:36.2218 s | 1.8808476 julianyear
254-
lustrum | 5 commonyear + 1 d + 05:03:49.8734 s | 5 years
255-
decade | 10 commonyear + 2 d + 10:07:39.7468 s | 10 years
256-
jupiteryear | 11 commonyear + 317 d + 19:40:59.124 s | 11.862615 julianyear
257-
saros | 18 commonyear + 15 d + 07:42:24.4 s | 223 synodicmonth
258-
saturnyear | 29 commonyear + 170 d + 16:46:02.8848 s | 29.447498 julianyear
259-
uranusyear | 84 commonyear + 27 d + 03:40:19.3296 s | 84.016846 julianyear
260-
century | 100 commonyear + 24 d + 05:16:37.4678 s | 100 years
261-
neptuneyear | 164 commonyear + 330 d + 00:42:40.032 s | 164.79132 julianyear
262-
plutoyear | 248 commonyear + 33 d + 00:25:04.44 s | 247.92065 julianyear
263-
millennia | 1000 commonyear + 242 d + 04:46:14.6784 s | millennium
264-
millennium | 1000 commonyear + 242 d + 04:46:14.6784 s | 1000 years
265-
cron | 1.00066e+06 commonyear + 203 d + 18:44:38.4023 s | 1e6 years
164+
name | unit | definition
165+
------------------+-----------------------------------------------+-----------------------------------------------
166+
plancktime | 5.39105895420117e-44 s | hbar / planckmass c^2
167+
t_P | 5.39105895420117e-44 s | plancktime
168+
atomictime | 24.188843266026 as | hbar^3/coulombconst^2 atomicmass e^4
169+
svedberg | 100 fs | 1e-13 s
170+
㎰ | 1 ps | ps
171+
㎱ | 1 ns | ns
172+
shake | 10 ns | 1e-8 sec
173+
㎲ | 1 µs | µs
174+
㎳ | 1 ms | ms
175+
jiffies | 10 ms | jiffy
176+
jiffy | 10 ms | 0.01 sec
177+
timeatom | 159.574468085106 ms | 1|47 timeounce
178+
Tim | 173.611111111111 ms | 12^-4 hour
179+
blink | 864 ms | 1e-5 day
180+
decimalsecond | 864 ms | 1|100 decimalminute
181+
siderealsecond | 997.269566435185 ms | 1|60 siderealminute
182+
s | 1 s | s
183+
sec | 1 s | s
184+
second | 1 s | s
185+
TIME | 1 s | second
186+
timeounce | 7.5 s | 1|8 timeostent
187+
siderealminute | 59.8361739861111 s | 1|60 siderealhour
188+
min | 00:01:00 s | minute
189+
minute | 00:01:00 s | 60 s
190+
timeostent | 00:01:00 s | 1|60 hour
191+
beat | 00:01:26.4 s | decimalminute
192+
decimalminute | 00:01:26.4 s | 1|100 decimalhour
193+
timeminute | 00:06:00 s | 1|10 hour
194+
timepoint | 00:12:00 s | 1|5 hour
195+
ce | 00:14:24 s | 1e-2 day
196+
bell | 00:30:00 s | 1|8 watch
197+
lunour | 00:59:03.67055555555 s | 1|24 lune
198+
siderealhour | 00:59:50.17043916667 s | 1|24 siderealday
199+
h | 01:00:00 s | hour
200+
hour | 01:00:00 s | 60 min
201+
hr | 01:00:00 s | hour
202+
decimalhour | 02:24:00 s | 1|10 day
203+
watch | 04:00:00 s | 4 hours
204+
jupiterday | 09:55:29.856 s | 0.41354 day
205+
saturnday | 10:30:00 s | 0.4375 day
206+
uranusday | 15:36:00 s | 0.65 day
207+
neptuneday | 18:25:55.2 s | 0.768 day
208+
lune | 23:37:28.0933333333 s | 1|30 lunation
209+
earthday | 23:56:04.09054 s | siderealday
210+
siderealday | 23:56:04.09054 s | 86164.09054 s
211+
㍲ | 1 d | da
212+
d | 1 d | day
213+
da | 1 d | day
214+
day | 1 d | 24 hr
215+
marsday | 1 d + 00:37:22.6632 s | 1.02595675 day
216+
plutoday | 6 d + 09:16:50.88 s | 6.3867 day
217+
sennight | 7 d | 7 day
218+
week | 7 d | 7 day
219+
wk | 7 d | week
220+
fortnight | 14 d | 14 day
221+
draconicmonth | 27 d + 05:05:35.79936 s | nodicalmonth
222+
draconiticmonth | 27 d + 05:05:35.79936 s | nodicalmonth
223+
nodicalmonth | 27 d + 05:05:35.79936 s | 27.2122199 day
224+
siderealmonth | 27 d + 07:43:11.5104 s | 27.321661 day
225+
anomalisticmonth | 27 d + 13:18:33.100128 s | 27.55454977 day
226+
islamicmonth | 29 d + 12:00:00 s | 1|12 islamicyear
227+
lunarmonth | 29 d + 12:44:02.8 s | 29 days + 12 hours + 44 minutes + 2.8 seconds
228+
lunation | 29 d + 12:44:02.8 s | synodicmonth
229+
synodicmonth | 29 d + 12:44:02.8 s | lunarmonth
230+
mo | 30 d + 10:29:03.8312232 s | month
231+
month | 30 d + 10:29:03.8312232 s | 1|12 year
232+
mercuryday | 58 d + 15:30:31.68 s | 58.6462 day
233+
mercuryyear | 87 d + 23:15:43.81992 s | 0.2408467 julianyear
234+
venusyear | 224 d + 16:49:09.052176 s | 0.61519726 julianyear
235+
venusday | 243 d + 00:14:24 s | 243.01 day
236+
eclipseyear | 346 d + 14:52:48 s | 346.62 days
237+
islamicyear | 354 d | 354 day
238+
lunaryear | 354 d + 08:48:33.6 s | 12 lunarmonth
239+
islamicleapyear | 355 d | 355 day
240+
calendaryear | 1 commonyear | 365 day
241+
commonyear | 1 commonyear | 365 day
242+
solaryear | 1 commonyear + 05:48:45.9746784 s | year
243+
tropicalyear | 1 commonyear + 05:48:45.9746784 s | 365.242198781 day
244+
year | 1 commonyear + 05:48:45.9746784 s | tropicalyear
245+
yr | 1 commonyear + 05:48:45.9746784 s | year
246+
gregorianyear | 1 commonyear + 05:49:12 s | 365.2425 day
247+
julianyear | 1 commonyear + 06:00:00 s | 365.25 day
248+
earthyear | 1 commonyear + 06:09:09.5400288 s | siderealyear
249+
siderealyear | 1 commonyear + 06:09:09.5400288 s | 365.256360417 day
250+
gaussianyear | 1 commonyear + 06:09:56.0153947 s | (2 pi / gauss_k) days
251+
anomalisticyear | 1 commonyear + 06:13:49.44 s | 365.2596 days
252+
leapyear | 1 commonyear + 1 d | 366 day
253+
marsyear | 1 commonyear + 321 d + 23:30:36.22176 s | 1.8808476 julianyear
254+
lustrum | 5 commonyear + 1 d + 05:03:49.873392 s | 5 years
255+
decade | 10 commonyear + 2 d + 10:07:39.746784 s | 10 years
256+
jupiteryear | 11 commonyear + 317 d + 19:40:59.124 s | 11.862615 julianyear
257+
saros | 18 commonyear + 15 d + 07:42:24.4 s | 223 synodicmonth
258+
saturnyear | 29 commonyear + 170 d + 16:46:02.8848 s | 29.447498 julianyear
259+
uranusyear | 84 commonyear + 27 d + 03:40:19.3296 s | 84.016846 julianyear
260+
century | 100 commonyear + 24 d + 05:16:37.46784 s | 100 years
261+
neptuneyear | 164 commonyear + 330 d + 00:42:40.032 s | 164.79132 julianyear
262+
plutoyear | 248 commonyear + 33 d + 00:25:04.44 s | 247.92065 julianyear
263+
millennia | 1000 commonyear + 242 d + 04:46:14.6784 s | millennium
264+
millennium | 1000 commonyear + 242 d + 04:46:14.6784 s | 1000 years
265+
cron | 1.00066e+06 commonyear + 203 d + 18:44:38.4 s | 1e6 years
266266
(100 rows)
267267

268268
/* custom time format is only used if dimension is time */

unit.c

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -239,16 +239,15 @@ print_time_interval (char **output_p, double t)
239239
int h, m;
240240
char *sign = "+";
241241
int ndig;
242-
double ulp;
243242

244243
/* print - */
245244
if (t < 0) {
246245
*output_p += sprintf(*output_p, "-");
247246
t = -t;
248247
sign = "-";
249248
}
250-
ndig = DBL_DIG + extra_float_digits - log2(t / 60.0); /* adjust seconds precision for d/h/min already printed */
251-
ulp = t * __DBL_EPSILON__; /* smallest remainder of seconds that should be printed */
249+
250+
ndig = DBL_DIG + extra_float_digits - log10(t); /* adjust seconds precision for d/h/min already printed */
252251

253252
/* print years */
254253
if (t >= TIME_YEAR) {
@@ -272,17 +271,30 @@ print_time_interval (char **output_p, double t)
272271
if (t == 0)
273272
return;
274273

275-
/* print hh:mm:ss.sss */
274+
/* print hh:mm: */
276275
h = trunc(t / TIME_HOUR);
277276
t = fmod(t, TIME_HOUR);
278277
m = trunc(t / TIME_MINUTE);
279278
t = fmod(t, TIME_MINUTE);
280279
*output_p += sprintf(*output_p, "%02d:%02d:", h, m);
280+
281+
/* print ss.sss */
281282
if (t < 10.0) /* zero-pad */
282283
*output_p += sprintf(*output_p, "0");
283-
if (t < ulp) /* clamp output smaller than input precision */
284-
t = 0;
285-
*output_p += sprintf(*output_p, "%.*g s", ndig, t);
284+
if (ndig < 0)
285+
ndig = 0;
286+
*output_p += sprintf(*output_p, "%.*f", ndig, t);
287+
if (ndig > 0) {
288+
/* strip trailing zeros from %f format */
289+
while (*(*output_p - 1) == '0') {
290+
--*output_p;
291+
}
292+
if (*(*output_p - 1) == '.') {
293+
--*output_p;
294+
}
295+
**output_p = '\0';
296+
}
297+
*output_p += sprintf(*output_p, " s");
286298
}
287299

288300
/* format Unit as string */

0 commit comments

Comments
 (0)