【问题标题】:Why can't you use scientific notation in kernel为什么你不能在内核中使用科学计数法
【发布时间】:2017-04-04 02:32:17
【问题描述】:

我正在尝试编写内核 (4.8.1) 模块,如果我使用

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));
}

它引发了这个错误

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

如果我使用

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));
}

它没有问题。

那么为什么不能在内核中使用科学记数法呢?我的意思是,我认为使用1e3; 1e6; 1e9 而不是1000; 1000000; 1000000000 更容易且更具可读性。

只是便携性/稳健性的问题吗?
或者类似的东西(在这种情况下)

你需要ns吗?使用ktime_to_ns
你需要我们吗?使用ktime_to_us
你需要女士吗?使用ktime_to_ms

附:我尝试了一个简单的 .c 程序,它可以正常工作

#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;
}

【问题讨论】:

  • 我认为主要问题不是符号,而是 1e3double 文字这一事实。内核中通常不支持浮点以节省寄存器的时间。

标签: c linux-kernel scientific-notation


【解决方案1】:

1e3等同于1000

1000int 类型的整数常量。 1e3double 类型的浮点常量,等价于 1000.0。这使得 remaining/1e3 成为浮点除法,这是编译器所抱怨的。

另见SSE register return with SSE disabled

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多