如何在C++中编写八进制浮点文字?

如何在C++中编写八进制浮点文字?,c++,floating-point,octal,C++,Floating Point,Octal,不知何故,我总是假设浮点值和整数值的处理方式相同,只是其中一个会有“.”字符 所以对于这样的代码: auto i = 0100; std::cout << i; 我得到了100个输出,这不是预期的结果。现在,浮点部分可能不处理前导0。因此,我尝试了一些真正应该有效的方法: auto d = 1.0e-010; std::cout << d; 给出错误:十六进制浮点常量需要指数 然而: auto d = 0x1e3; std::cout << d; 给出错

不知何故,我总是假设浮点值和整数值的处理方式相同,只是其中一个会有“.”字符

所以对于这样的代码:

auto i = 0100;
std::cout << i;
我得到了100个输出,这不是预期的结果。现在,浮点部分可能不处理前导0。因此,我尝试了一些真正应该有效的方法:

auto d = 1.0e-010;
std::cout << d;
给出错误:十六进制浮点常量需要指数

然而:

auto d = 0x1e3;
std::cout << d;

给出错误:无法找到数字文字运算符“运算符x3”

浮点文字不能在C++中以八进制书写。你必须接受十进制

标准C++不允许十六进制浮点文字。然而,C确实支持C99和编译器,它也允许C++中的十六进制作为语言的扩展。 十六进制似乎表现不同


对。有关如何编写十六进制浮点文字的详细信息,请参阅

< P>浮点文字不能在C++中以八进制写入。你必须接受十进制

#include <iostream>
#include <cmath>
using namespace std;

long double operator"" _oct (long double oct)
{
    int i = 0;
    long double rem, fract, decimal = 0.0;
    long whole = (long)oct;
    fract = oct - whole;

    // whole part
    while (whole != 0)
    {
        rem = fmod(whole,10);
        whole/=10;
        decimal += rem*pow(8,i++);
    }
    i = 1; 
    // fractional part
    while(fract != 0){
        fract *= 10;
        rem = round(fract);
        decimal += rem*pow(8,-i++);
        fract -= rem;
    }
    return decimal;
}

int main() {
    cout << 10.1_oct; //8.125
    return 0;
}

标准C++不允许十六进制浮点文字。然而,C确实支持C99和编译器,它也允许C++中的十六进制作为语言的扩展。 十六进制似乎表现不同


对。有关如何编写十六进制浮点文字的详细信息,请参阅。

您可以使用C++11的用户定义文字自己编写一个

#include <iostream>
#include <cmath>
using namespace std;

long double operator"" _oct (long double oct)
{
    int i = 0;
    long double rem, fract, decimal = 0.0;
    long whole = (long)oct;
    fract = oct - whole;

    // whole part
    while (whole != 0)
    {
        rem = fmod(whole,10);
        whole/=10;
        decimal += rem*pow(8,i++);
    }
    i = 1; 
    // fractional part
    while(fract != 0){
        fract *= 10;
        rem = round(fract);
        decimal += rem*pow(8,-i++);
        fract -= rem;
    }
    return decimal;
}

int main() {
    cout << 10.1_oct; //8.125
    return 0;
}

您可以使用C++11的用户定义文本自己制作一个

#include <iostream>
#include <cmath>
using namespace std;

long double operator"" _oct (long double oct)
{
    int i = 0;
    long double rem, fract, decimal = 0.0;
    long whole = (long)oct;
    fract = oct - whole;

    // whole part
    while (whole != 0)
    {
        rem = fmod(whole,10);
        whole/=10;
        decimal += rem*pow(8,i++);
    }
    i = 1; 
    // fractional part
    while(fract != 0){
        fract *= 10;
        rem = round(fract);
        decimal += rem*pow(8,-i++);
        fract -= rem;
    }
    return decimal;
}

int main() {
    cout << 10.1_oct; //8.125
    return 0;
}
两人都给出了很好的答案,但都有点不完整。下面是对它们的扩展和发现的附加信息

< C++中没有八进制浮点数……原因是

该标准没有定义八进制浮点数,编译器严格遵守这一特定规则。前导0被读取为整个部分或指数中的另一个十进制数字

造成这种情况的潜在原因是数字的模糊性,如0.2。大多数人会这么说⅕; 而如果八进制浮点数是一个现实,那么它将是¼,原因与0是八进制文字的原因相同

<>在C++中没有十六进制浮点数,但是…

…,但C语言中有。这么多编译器允许人们使用它们,但它们有点奇怪

首先,如果没有指数部分,它们就不能工作。因此,写入0x12a.b3可能不起作用

其次,在十六进制表示法中,e不是指数,因为它是一个数字14。因此,p的意思可能是幂

第三,指数是十六进制的,当然不是10,但出于某种原因,它不是16。而是2。所以0x12.4p3变成了1×16М+2×16⁰ + 4×16⁻1×2³=16+2+¼×8=146

在C++11中定义自己的文本相对来说比较简单

提供了自己的实现,但我认为最好将其重新制作成constexpr。最终结果是以下代码:

auto d = 0100.0;
std::cout << d;
constexpr unsigned long long operator"" _oct(unsigned long long l)
{
    return
        (l < 9) ? l :
        operator"" _oct(l/10)*8 + l%10;
}
constexpr long double operator"" _oct(long double d)
{
    return
        (d == 0) ? 0.0 :
        (d < 1) ? 0.125*(((int)(d*10)) + operator"" _oct(d*10-((int)(d*10)))) :
        operator"" _oct((unsigned long long)d) + operator"" _oct(d-(unsigned long long)d);
}
两人都给出了很好的答案,但都有点不完整。下面是对它们的扩展和发现的附加信息

< C++中没有八进制浮点数……原因是

该标准没有定义八进制浮点数,编译器严格遵守这一特定规则。前导0被读取为整个部分或指数中的另一个十进制数字

造成这种情况的潜在原因是数字的模糊性,如0.2。大多数人会这么说⅕; 而如果八进制浮点数是一个现实,那么它将是¼,原因与0是八进制文字的原因相同

<>在C++中没有十六进制浮点数,但是…

…,但C语言中有。这么多编译器允许人们使用它们,但它们有点奇怪

首先,如果没有指数部分,它们就不能工作。因此,写入0x12a.b3可能不起作用

其次,在十六进制表示法中,e不是指数,因为它是一个数字14。因此,p的意思可能是幂

第三,指数是十六进制的,当然不是10,但出于某种原因,它不是16。而是2。所以0x12.4p3变成了1×16М+2×16⁰ + 4×16⁻1×2³=16+2+¼×8=146

在C++11中定义自己的文本相对来说比较简单

提供了自己的实现,但我认为最好将其重新制作成constexpr。最终结果是以下代码:

auto d = 0100.0;
std::cout << d;
constexpr unsigned long long operator"" _oct(unsigned long long l)
{
    return
        (l < 9) ? l :
        operator"" _oct(l/10)*8 + l%10;
}
constexpr long double operator"" _oct(long double d)
{
    return
        (d == 0) ? 0.0 :
        (d < 1) ? 0.125*(((int)(d*10)) + operator"" _oct(d*10-((int)(d*10)))) :
        operator"" _oct((unsigned long long)d) + operator"" _oct(d-(unsigned long long)d);
}

在C++中没有八进制浮点文字,除了这个之外,你还尝试了什么?你在哪里卡住了?你研究了什么?说真的?你到底为什么想要一个八进制浮点文字?我认为这是一个完全合理的问题。“我只是好奇。”卡洛利霍瓦特一号研究人们感兴趣的东西。现在可能什么都不需要,为什么不学习呢
有趣的事情?在C++中没有八进制浮点文字。除了这个之外,你还尝试了什么?你在哪里卡住了?你研究了什么?说真的?你到底为什么想要一个八进制浮点文字?我认为这是一个完全合理的问题。“我只是好奇。”卡洛利霍瓦特一号研究人们感兴趣的东西。现在可能什么都不需要,为什么不学习有趣的东西呢?