Why can't you use scientific notation in the kernel

I tried to write a kernel module (4.8.1), and if I use

if (hrtimer_cancel(&hr_timer) == 1) {
         u64 remaining = ktime_to_ns(hrtimer_get_remaining(&hr_timer));
         printk("(%llu ns; %llu us)\n", remaining,
         (unsigned long long) (remaining/1e3));
}

he causes this error

error: SSE register return with SSE disabled
   printk("\t\t(%llu ns; %llu us)\n",
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          remaining,
          ~~~~~~~~~~
          (unsigned long long) (remaining/1e3));
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

and if i use

if (hrtimer_cancel(&hr_timer) == 1) {
         u64 remaining = ktime_to_ns(hrtimer_get_remaining(&hr_timer));
         printk("(%llu ns; %llu us)\n", remaining,
         (unsigned long long) (remaining/1000));
}

It works without problems.

So why can't you use scientific notation in the kernel? I mean, I think it's much easier and more readable to use 1e3; 1e6; 1e9instead 1000; 1000000; 1000000000.

Is it just portability / reliability?
Or something like (in this case)

Do you need ns? Use ktime_to_ns
We need you? Use ktime_to_us
Do you need ms? Usektime_to_ms

PS I tried with a simple .c program and it works without problems.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

void error_handler(const char *msg)
{
    perror(msg);
    exit(EXIT_FAILURE);
}

unsigned long parse_num(const char *number)
{
    unsigned long v;
    char *p;
    errno = 0;

    v = strtoul(number, &p, 10);

    if (errno != 0 || *p != '\0')
        error_handler("parse_num | strtoul");

    return v;
}

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        fprintf(stderr, "Usage: %s number_greater_than_1000\n", argv[0]);
        return EXIT_FAILURE;
    }

    unsigned long number = parse_num(argv[1]);

    if (number < 1e3 || number > 1e6)
    {
        fprintf(stderr, "Need to be a number in range (%lu, %lu)\n", (unsigned long) 1e3, (unsigned long) 1e6);
        return EXIT_FAILURE;
    }

    printf("Original: %lu\tScaled: %lu\n", number, (unsigned long) (number/1e3));

    return EXIT_SUCCESS;
}
+4
source share
1 answer

1e3 1000.

1000 - int. 1e3 - double, 1000.0. remaining/1e3 , .

. SSE SSE.

+6

Source: https://habr.com/ru/post/1661372/


All Articles