- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
#!/usr/bin/perl
use strict;
sub ternary_switch {
my ($def,%exp) = @_;
my $result = $def;
for my $key (keys %exp) {
$result = '(' . $key . ')?(' . $exp{$key} . '):(' . $result . ')';
}
return $result;
}
my $def = ' (int)sum/0 /*assert*/ ';
my %exp = (
'quant==2' => ' round((sum)*pow(10.0,prec-1)*5.0)/pow(10.0,prec-1)/5.0 ',
'quant==5' => ' round((sum)*pow(10.0,prec-1)*2.0)/pow(10.0,prec-1)/2.0 ',
'quant==1' => ' round((sum)*pow(10.0,prec))/pow(10.0,prec) ',
);
my $result = ternary_switch($def,%exp);
print $result . "\n";
#define ROUND_QUANT(sum,prec,quant) (quant==5)?( round((sum)*pow(10.0,prec-1)*2.0)/pow(10.0,prec-1)/2.0 ):\
((quant==2)?( round((sum)*pow(10.0,prec-1)*5.0)/pow(10.0,prec-1)/5.0 ):\
((quant==1)?( round((sum)*pow(10.0,prec))/pow(10.0,prec) ):\
( (int)sum/0 /*assert*/ )))
Округление с дробной точностью.
Если бы я не прочитал на говнокоде что тернарники можно вкладывать, мне бы никогда это не пришло в голову