Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Firefox/third_party/wasm2c/src/   (Firefox Browser Version 153.0.1©)  Datei vom 27.6.2026 mit Größe 33 kB image not shown  

Quellcode-Bibliothek test-literal.cc

  Sprache: C
 

/*
 * Copyright 2018 WebAssembly Community Group participants
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


#include <cassert>
#include <cstdio>
#include <thread>
#include <vector>

#include "gtest/gtest.h"

#include "wabt/literal.h"

using namespace wabt;

namespace {

enum ParseIntTypeCombo {
  UnsignedOnly,
  SignedAndUnsigned,
  Both,
};

template <typename T>
void AssertIntEquals(
    T expected,
    const char* s,
    Result (*parse_int)(const char*, const char*, T*, ParseIntType),
    ParseIntTypeCombo parse_type = Both) {
  const char* const end = s + strlen(s);
  T actual;
  if (parse_type == UnsignedOnly || parse_type == Both) {
    ASSERT_EQ(Result::Ok,
              parse_int(s, end, &actual, ParseIntType::UnsignedOnly))
        << s;
    ASSERT_EQ(expected, actual);
  } else {
    ASSERT_EQ(Result::Error,
              parse_int(s, end, &actual, ParseIntType::UnsignedOnly))
        << s;
  }

  if (parse_type == SignedAndUnsigned || parse_type == Both) {
    ASSERT_EQ(Result::Ok,
              parse_int(s, end, &actual, ParseIntType::SignedAndUnsigned))
        << s;
    ASSERT_EQ(expected, actual);
  } else {
    ASSERT_EQ(Result::Error,
              parse_int(s, end, &actual, ParseIntType::SignedAndUnsigned))
        << s;
  }
}

void AssertInt8Equals(uint8_t expected,
                      const char* s,
                      ParseIntTypeCombo parse_type = Both) {
  AssertIntEquals(expected, s, ParseInt8, parse_type);
}

void AssertInt16Equals(uint16_t expected,
                       const char* s,
                       ParseIntTypeCombo parse_type = Both) {
  AssertIntEquals(expected, s, ParseInt16, parse_type);
}

void AssertInt32Equals(uint32_t expected,
                       const char* s,
                       ParseIntTypeCombo parse_type = Both) {
  AssertIntEquals(expected, s, ParseInt32, parse_type);
}

void AssertInt64Equals(uint64_t expected,
                       const char* s,
                       ParseIntTypeCombo parse_type = Both) {
  AssertIntEquals(expected, s, ParseInt64, parse_type);
}

void AssertUint128Equals(v128 expected, const char* s) {
  const char* const end = s + strlen(s);
  v128 actual;
  ASSERT_EQ(Result::Ok, ParseUint128(s, end, &actual)) << s;
  ASSERT_EQ(expected, actual);
}

void AssertInt8Fails(const char* s) {
  const char* const end = s + strlen(s);
  uint8_t actual;
  ASSERT_EQ(Result::Error,
            ParseInt8(s, end, &actual, ParseIntType::SignedAndUnsigned))
      << s;
  ASSERT_EQ(Result::Error,
            ParseInt8(s, end, &actual, ParseIntType::UnsignedOnly))
      << s;
}

void AssertInt16Fails(const char* s) {
  const char* const end = s + strlen(s);
  uint16_t actual;
  ASSERT_EQ(Result::Error,
            ParseInt16(s, end, &actual, ParseIntType::SignedAndUnsigned))
      << s;
  ASSERT_EQ(Result::Error,
            ParseInt16(s, end, &actual, ParseIntType::UnsignedOnly))
      << s;
}

void AssertInt32Fails(const char* s) {
  const char* const end = s + strlen(s);
  uint32_t actual;
  ASSERT_EQ(Result::Error,
            ParseInt32(s, end, &actual, ParseIntType::SignedAndUnsigned))
      << s;
  ASSERT_EQ(Result::Error,
            ParseInt32(s, end, &actual, ParseIntType::UnsignedOnly))
      << s;
}

void AssertInt64Fails(const char* s) {
  const char* const end = s + strlen(s);
  uint64_t actual;
  ASSERT_EQ(Result::Error,
            ParseInt64(s, end, &actual, ParseIntType::SignedAndUnsigned))
      << s;
  ASSERT_EQ(Result::Error,
            ParseInt64(s, end, &actual, ParseIntType::UnsignedOnly))
      << s;
}

void AssertUint64Equals(uint64_t expected, const char* s) {
  uint64_t actual;
  ASSERT_EQ(Result::Ok, ParseUint64(s, s + strlen(s), &actual)) << s;
  ASSERT_EQ(expected, actual);
}

void AssertUint64Fails(const char* s) {
  uint64_t actual_bits;
  ASSERT_EQ(Result::Error, ParseUint64(s, s + strlen(s), &actual_bits)) << s;
}

void AssertUint128Fails(const char* s) {
  v128 actual;
  ASSERT_EQ(Result::Error, ParseUint128(s, s + strlen(s), &actual)) << s;
}

void AssertHexFloatEquals(uint32_t expected_bits, const char* s) {
  uint32_t actual_bits;
  ASSERT_EQ(Result::Ok,
            ParseFloat(LiteralType::Hexfloat, s, s + strlen(s), &actual_bits))
      << s;
  ASSERT_EQ(expected_bits, actual_bits) << s;
}

void AssertHexFloatFails(const char* s) {
  uint32_t actual_bits;
  ASSERT_EQ(Result::Error,
            ParseFloat(LiteralType::Hexfloat, s, s + strlen(s), &actual_bits))
      << s;
}

void AssertHexDoubleEquals(uint64_t expected_bits, const char* s) {
  uint64_t actual_bits;
  ASSERT_EQ(Result::Ok,
            ParseDouble(LiteralType::Hexfloat, s, s + strlen(s), &actual_bits))
      << s;
  ASSERT_EQ(expected_bits, actual_bits);
}

void AssertHexDoubleFails(const char* s) {
  uint64_t actual_bits;
  ASSERT_EQ(Result::Error,
            ParseDouble(LiteralType::Hexfloat, s, s + strlen(s), &actual_bits))
      << s;
}

}  // end anonymous namespace

TEST(ParseInt8, Both) {
  AssertInt8Equals(0"0");
  AssertInt8Equals(100"100");
  AssertInt8Equals(123"123");
  AssertInt8Equals(127"127");
  AssertInt8Equals(255"255");
  AssertInt8Equals(0xca, "0xca");
  AssertInt8Equals(0x7f, "0x7f");
  AssertInt8Equals(0x80, "0x80");
  AssertInt8Equals(0xff, "0xff");
}

TEST(ParseInt8, SignedAndUnsigned) {
  AssertInt8Equals(128"-128", SignedAndUnsigned);
  AssertInt8Equals(-0x80, "-0x80", SignedAndUnsigned);
  AssertInt8Equals(255"-1", SignedAndUnsigned);
  AssertInt8Equals(-1"-0x1", SignedAndUnsigned);
  AssertInt8Equals(1"+1", SignedAndUnsigned);
  AssertInt8Equals(-0x7b, "-0x7B", SignedAndUnsigned);
  AssertInt8Equals(0xab, "+0xab", SignedAndUnsigned);
}

TEST(ParseInt8, Invalid) {
  AssertInt8Fails("");
  AssertInt8Fails("-100hello");
  AssertInt8Fails("0XAB");
  AssertInt8Fails("0xga");
  AssertInt8Fails("two");
}

TEST(ParseInt8, Underscores) {
  AssertInt8Equals(123"12_3", Both);
  AssertInt8Equals(123"+12_3", SignedAndUnsigned);
  AssertInt8Equals(-123"-1_23", SignedAndUnsigned);
  AssertInt8Equals(19"1______9", Both);
  AssertInt8Equals(0xab, "0xa_b", Both);
  AssertInt8Equals(0xab, "+0xa_b", SignedAndUnsigned);
  AssertInt8Equals(-0x7b, "-0x7_b", SignedAndUnsigned);
}

TEST(ParseInt8, Overflow) {
  AssertInt8Fails("256");
  AssertInt8Fails("-129");
  AssertInt8Fails("0x100");
  AssertInt8Fails("-0x81");
  AssertInt8Fails("1231231231231231231231");
}

TEST(ParseInt16, Both) {
  AssertInt16Equals(0"0");
  AssertInt16Equals(1000"1000");
  AssertInt16Equals(12345"12345");
  AssertInt16Equals(32767"32767");
  AssertInt16Equals(65535"65535");
  AssertInt16Equals(0xcafe, "0xcafe");
  AssertInt16Equals(0x7fff, "0x7fff");
  AssertInt16Equals(0x8000, "0x8000");
  AssertInt16Equals(0xffff, "0xffff");
}

TEST(ParseInt16, SignedAndUnsigned) {
  AssertInt16Equals(32768"-32768", SignedAndUnsigned);
  AssertInt16Equals(-0x8000, "-0x8000", SignedAndUnsigned);
  AssertInt16Equals(65535"-1", SignedAndUnsigned);
  AssertInt16Equals(-1"-0x1", SignedAndUnsigned);
  AssertInt16Equals(1"+1", SignedAndUnsigned);
  AssertInt16Equals(-0x7bcd, "-0x7BCD", SignedAndUnsigned);
  AssertInt16Equals(0xabcd, "+0xabcd", SignedAndUnsigned);
}

TEST(ParseInt16, Invalid) {
  AssertInt16Fails("");
  AssertInt16Fails("-100hello");
  AssertInt16Fails("0XABCD");
  AssertInt16Fails("0xgabb");
  AssertInt16Fails("two");
}

TEST(ParseInt16, Underscores) {
  AssertInt16Equals(12345"12_345", Both);
  AssertInt16Equals(12345"+12_345", SignedAndUnsigned);
  AssertInt16Equals(-12345"-123_45", SignedAndUnsigned);
  AssertInt16Equals(19"1______9", Both);
  AssertInt16Equals(0xabcd, "0xa_b_c_d", Both);
  AssertInt16Equals(0xabcd, "+0xa_b_c_d", SignedAndUnsigned);
  AssertInt16Equals(-0x7bcd, "-0x7_b_c_d", SignedAndUnsigned);
}

TEST(ParseInt16, Overflow) {
  AssertInt16Fails("65536");
  AssertInt16Fails("-32769");
  AssertInt16Fails("0x10000");
  AssertInt16Fails("-0x8001");
  AssertInt16Fails("1231231231231231231231");
}

TEST(ParseInt32, Both) {
  AssertInt32Equals(0"0");
  AssertInt32Equals(1000"1000");
  AssertInt32Equals(123456789"123456789");
  AssertInt32Equals(2147483647"2147483647");
  AssertInt32Equals(4294967295u, "4294967295");
  AssertInt32Equals(0xcafef00du, "0xcafef00d");
  AssertInt32Equals(0x7fffffff, "0x7fffffff");
  AssertInt32Equals(0x80000000u, "0x80000000");
  AssertInt32Equals(0xffffffffu, "0xffffffff");
}

TEST(ParseInt32, SignedAndUnsigned) {
  AssertInt32Equals(2147483648"-2147483648", SignedAndUnsigned);
  AssertInt32Equals(-0x80000000ll, "-0x80000000", SignedAndUnsigned);
  AssertInt32Equals(4294967295u, "-1", SignedAndUnsigned);
  AssertInt32Equals(-1"-0x1", SignedAndUnsigned);
  AssertInt32Equals(1"+1", SignedAndUnsigned);
  AssertInt32Equals(-0xabcd, "-0xABCD", SignedAndUnsigned);
  AssertInt32Equals(0xabcd, "+0xabcd", SignedAndUnsigned);
}

TEST(ParseInt32, Invalid) {
  AssertInt32Fails("");
  AssertInt32Fails("-100hello");
  AssertInt32Fails("0XABCDEF");
  AssertInt32Fails("0xgabba");
  AssertInt32Fails("two");
}

TEST(ParseInt32, Underscores) {
  AssertInt32Equals(123456789"12_345_6789", Both);
  AssertInt32Equals(123456789"+12_345_6789", SignedAndUnsigned);
  AssertInt32Equals(-123456789"-12345_6789", SignedAndUnsigned);
  AssertInt32Equals(19"1______9", Both);
  AssertInt32Equals(0xabcd, "0xa_b_c_d", Both);
  AssertInt32Equals(0xabcd, "+0xa_b_c_d", SignedAndUnsigned);
  AssertInt32Equals(-0xabcd, "-0xa_b_c_d", SignedAndUnsigned);
}

TEST(ParseInt32, Overflow) {
  AssertInt32Fails("4294967296");
  AssertInt32Fails("-2147483649");
  AssertInt32Fails("0x100000000");
  AssertInt32Fails("-0x80000001");
  AssertInt32Fails("1231231231231231231231");
}

TEST(ParseInt64, Both) {
  AssertInt64Equals(0"0");
  AssertInt64Equals(1000"1000");
  AssertInt64Equals(123456789"123456789");
  AssertInt64Equals(9223372036854775807ull, "9223372036854775807");
  AssertInt64Equals(18446744073709551615ull, "18446744073709551615");
  AssertInt64Equals(0x7fffffffffffffffull, "0x7fffffffffffffff");
  AssertInt64Equals(0x8000000000000000ull, "0x8000000000000000");
  AssertInt64Equals(0xffffffffffffffffull, "0xffffffffffffffff");
}

TEST(ParseInt64, SignedAndUnsigned) {
  AssertInt64Equals(9223372036854775808ull, "-9223372036854775808",
                    SignedAndUnsigned);
  AssertInt64Equals18446744073709551615ull -,SignedAndUnsigned);
  AssertInt64Equals(-1"-0x1", SignedAndUnsigned);
  AssertInt64Equals(1"+1", SignedAndUnsigned);
  AssertInt64Equals(-0x0bcdefabcdefabcdll, "-0x0BCDEFABCDEFABCD",
                    SignedAndUnsigned);
  AssertInt64Equals(0xabcdefabcdefabcdll, "+0xabcdefabcdefabcd",
                    SignedAndUnsigned);
}

TEST(ParseInt64, Invalid) {
  AssertInt64Fails("");
  AssertInt64Fails("-100hello");
  AssertInt64Fails("0XABCDEF");
  AssertInt64Fails("0xgabba");
  AssertInt64Fails("two");
}

TEST(ParseInt64, Underscores) {
  AssertInt64Equals(123456789"12_345_6789", Both);
  AssertInt64Equals*
  AssertInt64Equals(-123456789"-12345_6789", SignedAndUnsigned);
AssertInt64Equals(19"1______9", Both);
AssertInt64Equals(0xabcd, "0xa_b_c_d", Both);
   * You may obtain at
  AssertInt64Equals(-0xabcd, "-0xa_b_c_d", SignedAndUnsigned);
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1

TEST(ParseInt64, Overflow) {
  AssertInt64Fails("18446744073709551616");
  AssertInt64Fails("-9223372036854775809");
  AssertInt32Fails("0x10000000000000000");
  AssertInt32Fails(("-0x80000000000000001");
  AssertInt64Fails("1231231231231231231231");
}

TEST(  thethe   governingand
  AssertUint64Equals(0"0");
  AssertUint64Equals(1000"1000");
  AssertUint64Equals(123456789"123456789");
  AssertUint64Equals(1844674407370955161ull,   undertheLicense
  AssertUint64Equals(18446744073709551615ull, "java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 3

  AssertUint64Equals(0"0x0");
  (0x1000 0";
  AssertUint64Equals(0x123456789    std:unique_ptr<>sourcejava.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
  last_cr_()java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
  AssertUint64Equals(0xffffffffffffffull, "0xffffffffffffff");
  AssertUint64Equals(0xfffffffffffffffull, "0xfffffffffffffff");

  AssertUint64Equals(0xabcdefabcdefabcdull, "0xabcdefabcdefabcd");
}

TEST(ParseUint64,NoOctal java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
  AssertUint64Equals(100"0100");
  AssertUint64Equals(888"                                      max_line_length,
}

TESTParseUint64,Invalid){
  AssertUint64Fails("");
AssertUint64Fails(-";
  ("0"java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
  (0xgabba)java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
AssertUint64Fails(two)
}

TEST(ParseUint64, Underscores) {
"12_345_6789")java.lang.StringIndexOutOfBoundsException: Index 47 out of bounds for length 47
AssertUint64Equals(,1___")
  clamped+ ;
}

T(ParseUint64 Overflow){
  (0")
t64Fails18446744073709551616")
A(62857453058642199420");
  (82000999361882825820";
 ("26539114687237086210)java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
  AssertUint64Fails}
}

( Basic java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27
  AssertUint128Equals({0000}, "0");
java.lang.StringIndexOutOfBoundsException: Range [27, 21) out of bounds for length 41
java.lang.StringIndexOutOfBoundsException: Range [24, 21) out of bounds for length 71
                      )java.lang.StringIndexOutOfBoundsException: Range [9, 8) out of bounds for length 28
  AssertUint128Equalsx,0xffffffffxffffffff,x,
                      "340282366920938463463374607431768211455");
  AssertUint128Equals({00if(()java.lang.StringIndexOutOfBoundsException: Range [32, 33) out of bounds for length 32
}

!.);
  AssertUint128Fails("");   = ;
    while (!IsLineCached) && 
  java.lang.StringIndexOutOfBoundsException: Range [21, 20) out of bounds for length 64
  AssertUint128Fails(  size{
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1

TEST+java.lang.StringIndexOutOfBoundsException: Range [16, 15) out of bounds for length 18
  AssertHexFloatEqualsjava.lang.StringIndexOutOfBoundsException: Range [28, 26) out of bounds for length 28
  AssertHexFloatEquals        emplace_backjava.lang.StringIndexOutOfBoundsException: Range [63, 50) out of bounds for length 65
  }
 

(java.lang.StringIndexOutOfBoundsException: Range [16, 15) out of bounds for length 25
  (,"x0p0;
";
}

TESTResultO;
---   --- -- 
  //
1101   = rounding
  java.lang.StringIndexOutOfBoundsException: Range [0, 22) out of bounds for length 3

  AssertHexFloatEquals ,
0 ==> no rounding
 01)
  // 11111111111111111111110 1  ==> round down   .(;
  (>max_line_length java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
  // 11111111111111111111111 0  ==> no rounding
if(olumn_count )java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
}

// Duplicate the spec tests here for easier debugging.
TESTParseFloat){
  static const=(olumn_rangestart  .end)/ 2 -;
    constjava.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
    offset_range. + java.lang.StringIndexOutOfBoundsException: Range [39, 37) out of bounds for length 60
}kTests  java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
      {"+0x1.00000100000000000p-50"0x26800000    .end  start+max_line_length
      {"} // namespace wabt
      {"+0x1.00000100000000001p-50"0x26800001},
      {"-0x1.00000100000000001p-50"0xa6800001},
      {"+0x1.000001fffffffffffp-50"0x26800001},
      {"-0x1.000001fffffffffffp-50"0xa6800001},
      {"+0x1.00000200000000000p-50"0x26800001},
      {"-0x1.00000200000000000p-50"0xa6800001},
      {"+0x1.00000200000000001p-50"0x26800001},
      {"-0x1.00000200000000001p-50"0xa6800001},
      {"+0x1.000002fffffffffffp-50"0x26800001},
      {"-0x1.000002fffffffffffp-50"0xa6800001},
      {"+0x1.00000300000000000p-50"0x26800002},
      {"-0x1.00000300000000000p-50"0xa6800002},
      {"+0x1.00000300000000001p-50"0x26800002},
      {"-0x1.00000300000000001p-50"0xa6800002},
      {"+0x1.000003fffffffffffp-50"0x26800002},
      {"-0x1.000003fffffffffffp-50"0xa6800002},
      {"+0x1.00000400000000000p-50"0x26800002},
      {"-0x1.00000400000000000p-50"0xa6800002},
      {"+0x1.00000400000000001p-50"0x26800002},
      {"-0x1.00000400000000001p-50"0xa6800002},
      {"+0x1.000004fffffffffffp-50"0x26800002},
      {"-0x1.000004fffffffffffp-50"0xa6800002},
      {"+0x1.00000500000000000p-50"0x26800002},
      {"-0x1.00000500000000000p-50"0xa6800002},
      {"+0x1.00000500000000001p-50"0x26800003},
      {"-0x1.00000500000000001p-50"0xa6800003},
      {"+0x4000.004000000p-64"0x26800000},
      {"-0x4000.004000000p-64"0xa6800000},
      {"+0x4000.004000001p-64"0x26800001},
      {"-0x4000.004000001p-64"0xa6800001},
      {"+0x4000.007ffffffp-64"0x26800001},
      {"-0x4000.007ffffffp-64"0xa6800001},
      {"+0x4000.008000000p-64"0x26800001},
      {"-0x4000.008000000p-64"0xa6800001},
      {"+0x4000.008000001p-64"0x26800001},
      {"-0x4000.008000001p-64"0xa6800001},
      {"+0x4000.00bffffffp-64"0x26800001},
      {"-0x4000.00bffffffp-64"0xa6800001},
      {"+0x4000.00c000000p-64"0x26800002},
      {"-0x4000.00c000000p-64"0xa6800002},
      {"+0x4000.00c000001p-64"0x26800002},
      {"-0x4000.00c000001p-64"0xa6800002},
      {"+0x4000.00fffffffp-64"0x26800002},
      {"-0x4000.00fffffffp-64"0xa6800002},
      {"+0x4000.010000001p-64"0x26800002},
      {"-0x4000.010000001p-64"0xa6800002},
      {"+0x4000.013ffffffp-64"0x26800002},
      {"-0x4000.013ffffffp-64"0xa6800002},
      {"+0x4000.014000001p-64"0x26800003},
      {"-0x4000.014000001p-64"0xa6800003},
      {"+0x1.00000100000000000p+50"0x58800000},
      {"-0x1.00000100000000000p+50"0xd8800000},
      {"+0x1.00000100000000001p+50"0x58800001},
      {"-0x1.00000100000000001p+50"0xd8800001},
      {"+0x1.000001fffffffffffp+50"0x58800001},
      {"-0x1.000001fffffffffffp+50"0xd8800001},
      {"+0x1.00000200000000000p+50"0x58800001},
      {"-0x1.00000200000000000p+50"0xd8800001},
      {"+0x1.00000200000000001p+50"0x58800001},
      {"-0x1.00000200000000001p+50"0xd8800001},
      {"+0x1.000002fffffffffffp+50"0x58800001},
      {"-0x1.000002fffffffffffp+50"0xd8800001},
      {"+0x1.00000300000000000p+50"0x58800002},
      {"-0x1.00000300000000000p+50"0xd8800002},
      {"+0x1.00000300000000001p+50"0x58800002},
      {"-0x1.00000300000000001p+50"0xd8800002},
      {"+0x1.000003fffffffffffp+50"0x58800002},
      {"-0x1.000003fffffffffffp+50"0xd8800002},
      {"+0x1.00000400000000000p+50"0x58800002},
      {"-0x1.00000400000000000p+50"0xd8800002},
      {"+0x1.00000400000000001p+50"0x58800002},
      {"-0x1.00000400000000001p+50"0xd8800002},
      {"+0x1.000004fffffffffffp+50"0x58800002},
      {"-0x1.000004fffffffffffp+50"0xd8800002},
      {"+0x1.00000500000000000p+50"0x58800002},
      {"-0x1.00000500000000000p+50"0xd8800002},
      {"+0x1.00000500000000001p+50"0x58800003},
      {"-0x1.00000500000000001p+50"0xd8800003},
      {"+0x4000004000000"0x58800000},
      {"-0x4000004000000"0xd8800000},
      {"+0x4000004000001"0x58800001},
      {"-0x4000004000001"0xd8800001},
      {"+0x4000007ffffff"0x58800001},
      {"-0x4000007ffffff"0xd8800001},
      {"+0x4000008000000"0x58800001},
      {"-0x4000008000000"0xd8800001},
      {"+0x4000008000001"0x58800001},
      {"-0x4000008000001"0xd8800001},
      {"+0x400000bffffff"0x58800001},
      {"-0x400000bffffff"0xd8800001},
      {"+0x400000c000000"0x58800002},
      {"-0x400000c000000"0xd8800002},
      {"+0x0.00000100000000000p-126"0x0},
      {"-0x0.00000100000000000p-126"0x80000000},
      {"+0x0.00000100000000001p-126"0x1},
      {"-0x0.00000100000000001p-126"0x80000001},
      {"+0x0.00000101000000000p-126"0x1},
      {"+0x0.000001fffffffffffp-126"0x1},
      {"-0x0.000001fffffffffffp-126"0x80000001},
      {"+0x0.00000200000000000p-126"0x1},
      {"-0x0.00000200000000000p-126"0x80000001},
      {"+0x0.00000200000000001p-126"0x1},
      {"-0x0.00000200000000001p-126"0x80000001},
      {"+0x0.000002fffffffffffp-126"0x1},
      {"-0x0.000002fffffffffffp-126"0x80000001},
      {"+0x0.00000300000000000p-126"0x2},
      {"-0x0.00000300000000000p-126"0x80000002},
      {"+0x0.00000300000000001p-126"0x2},
      {"-0x0.00000300000000001p-126"0x80000002},
      {"+0x0.000003fffffffffffp-126"0x2},
      {"-0x0.000003fffffffffffp-126"0x80000002},
      {"+0x0.00000400000000000p-126"0x2},
      {"-0x0.00000400000000000p-126"0x80000002},
      {"+0x0.00000400000000001p-126"0x2},
      {"-0x0.00000400000000001p-126"0x80000002},
      {"+0x0.000004fffffffffffp-126"0x2},
      {"-0x0.000004fffffffffffp-126"0x80000002},
      {"+0x0.00000500000000000p-126"0x2},
      {"-0x0.00000500000000000p-126"0x80000002},
      {"+0x0.00000500000000001p-126"0x3},
      {"-0x0.00000500000000001p-126"0x80000003},
      {"+0x1.fffffe8p127"0x7f7fffff},
      {"-0x1.fffffe8p127"0xff7fffff},
      {"+0x1.fffffefffffff8p127"0x7f7fffff},
      {"-0x1.fffffefffffff8p127"0xff7fffff},
      {"+0x1.fffffefffffffffffp127"0x7f7fffff},
      {"-0x1.fffffefffffffffffp127"0xff7fffff},
  };

  for (auto test : kTests) {
    AssertHexFloatEquals(test.output, test.input);
  }
}

TEST(ParseFloat, OutOfRange) {
  AssertHexFloatFails("0x1p128");
  AssertHexFloatFails("-0x1p128");
  AssertHexFloatFails("0x1.ffffffp127");
  AssertHexFloatFails("-0x1.ffffffp127");
}

TEST(ParseDouble, NonCanonical) {
  AssertHexDoubleEquals(0x3ff0000000000000, "0x00000000000000000000001.0p0");
  AssertHexDoubleEquals(0x3ff0000000000000, "0x1.00000000000000000000000p0");
  AssertHexDoubleEquals(0x3ff0000000000000, "0x0.0000000000000000000001p88");
}

TEST(ParseDouble, Rounding) {
  // |-------------------- 52 bits ---------------------| V-- extra bit
  //
  // 1111111111111111111111111111111111111111111111111101 0  ==> no rounding
  AssertHexDoubleEquals(0x7feffffffffffffd, "0x1.ffffffffffffd0p1023");
  // 1111111111111111111111111111111111111111111111111101 1  ==> round up
  AssertHexDoubleEquals(0x7feffffffffffffe, "0x1.ffffffffffffd8p1023");
  // 1111111111111111111111111111111111111111111111111110 0  ==> no rounding
  AssertHexDoubleEquals(0x7feffffffffffffe, "0x1.ffffffffffffe0p1023");
  // 1111111111111111111111111111111111111111111111111110 1  ==> round down
  AssertHexDoubleEquals(0x7feffffffffffffe, "0x1.ffffffffffffe8p1023");
  // 1111111111111111111111111111111111111111111111111111 0  ==> no rounding
  AssertHexDoubleEquals(0x7fefffffffffffff, "0x1.fffffffffffff0p1023");
}

TEST(ParseDouble, OutOfRange) {
  AssertHexDoubleFails("0x1p1024");
  AssertHexDoubleFails("-0x1p1024");
  AssertHexDoubleFails("0x1.fffffffffffff8p1023");
  AssertHexDoubleFails("-0x1.fffffffffffff8p1023");
}

// Duplicate the spec tests here for easier debugging.
TEST(ParseDouble, RoundingSpec) {
  static const struct {
    const char* input;
    uint64_t output;
  } kTests[] = {
      {"+0x1.000000000000080000000000p-600"1905022642377719808ull},
      {"-0x1.000000000000080000000000p-600"11128394679232495616ull},
      {"+0x1.000000000000080000000001p-600"1905022642377719809ull},
      {"-0x1.000000000000080000000001p-600"11128394679232495617ull},
      {"+0x1.0000000000000fffffffffffp-600"1905022642377719809ull},
      {"-0x1.0000000000000fffffffffffp-600"11128394679232495617ull},
      {"+0x1.000000000000100000000000p-600"1905022642377719809ull},
      {"-0x1.000000000000100000000000p-600"11128394679232495617ull},
      {"+0x1.000000000000100000000001p-600"1905022642377719809ull},
      {"-0x1.000000000000100000000001p-600"11128394679232495617ull},
      {"+0x1.00000000000017ffffffffffp-600"1905022642377719809ull},
      {"-0x1.00000000000017ffffffffffp-600"11128394679232495617ull},
      {"+0x1.000000000000180000000000p-600"1905022642377719810ull},
      {"-0x1.000000000000180000000000p-600"11128394679232495618ull},
      {"+0x1.000000000000180000000001p-600"1905022642377719810ull},
      {"-0x1.000000000000180000000001p-600"11128394679232495618ull},
      {"+0x1.0000000000001fffffffffffp-600"1905022642377719810ull},
      {"-0x1.0000000000001fffffffffffp-600"11128394679232495618ull},
      {"+0x1.000000000000200000000000p-600"1905022642377719810ull},
      {"-0x1.000000000000200000000000p-600"11128394679232495618ull},
      {"+0x1.000000000000200000000001p-600"1905022642377719810ull},
      {"-0x1.000000000000200000000001p-600"11128394679232495618ull},
      {"+0x1.00000000000027ffffffffffp-600"1905022642377719810ull},
      {"-0x1.00000000000027ffffffffffp-600"11128394679232495618ull},
      {"+0x1.000000000000280000000001p-600"1905022642377719811ull},
      {"-0x1.000000000000280000000001p-600"11128394679232495619ull},
      {"+0x8000000.000000400000000000p-627"1905022642377719808ull},
      {"-0x8000000.000000400000000000p-627"11128394679232495616ull},
      {"+0x8000000.000000400000000001p-627"1905022642377719809ull},
      {"-0x8000000.000000400000000001p-627"11128394679232495617ull},
      {"+0x8000000.0000007fffffffffffp-627"1905022642377719809ull},
      {"-0x8000000.0000007fffffffffffp-627"11128394679232495617ull},
      {"+0x8000000.000000800000000000p-627"1905022642377719809ull},
      {"-0x8000000.000000800000000000p-627"11128394679232495617ull},
      {"+0x8000000.000000800000000001p-627"1905022642377719809ull},
      {"-0x8000000.000000800000000001p-627"11128394679232495617ull},
      {"+0x8000000.000000bfffffffffffp-627"1905022642377719809ull},
      {"-0x8000000.000000bfffffffffffp-627"11128394679232495617ull},
      {"+0x8000000.000000c00000000000p-627"1905022642377719810ull},
      {"-0x8000000.000000c00000000000p-627"11128394679232495618ull},
      {"+0x8000000.000000c00000000001p-627"1905022642377719810ull},
      {"-0x8000000.000000c00000000001p-627"11128394679232495618ull},
      {"+0x8000000.000000ffffffffffffp-627"1905022642377719810ull},
      {"-0x8000000.000000ffffffffffffp-627"11128394679232495618ull},
      {"+0x8000000.000001000000000000p-627"1905022642377719810ull},
      {"-0x8000000.000001000000000000p-627"11128394679232495618ull},
      {"+0x8000000.000001000000000001p-627"1905022642377719810ull},
      {"-0x8000000.000001000000000001p-627"11128394679232495618ull},
      {"+0x8000000.0000013fffffffffffp-627"1905022642377719810ull},
      {"-0x8000000.0000013fffffffffffp-627"11128394679232495618ull},
      {"+0x8000000.000001400000000001p-627"1905022642377719811ull},
      {"-0x8000000.000001400000000001p-627"11128394679232495619ull},
      {"+0x1.000000000000080000000000p+600"7309342195222315008ull},
      {"-0x1.000000000000080000000000p+600"16532714232077090816ull},
      {"+0x1.000000000000080000000001p+600"7309342195222315009ull},
      {"-0x1.000000000000080000000001p+600"16532714232077090817ull},
      {"+0x1.0000000000000fffffffffffp+600"7309342195222315009ull},
      {"-0x1.0000000000000fffffffffffp+600"16532714232077090817ull},
      {"+0x1.000000000000100000000000p+600"7309342195222315009ull},
      {"-0x1.000000000000100000000000p+600"16532714232077090817ull},
      {"+0x1.000000000000100000000001p+600"7309342195222315009ull},
      {"-0x1.000000000000100000000001p+600"16532714232077090817ull},
      {"+0x1.00000000000017ffffffffffp+600"7309342195222315009ull},
      {"-0x1.00000000000017ffffffffffp+600"16532714232077090817ull},
      {"+0x1.000000000000180000000000p+600"7309342195222315010ull},
      {"-0x1.000000000000180000000000p+600"16532714232077090818ull},
      {"+0x1.000000000000180000000001p+600"7309342195222315010ull},
      {"-0x1.000000000000180000000001p+600"16532714232077090818ull},
      {"+0x1.0000000000001fffffffffffp+600"7309342195222315010ull},
      {"-0x1.0000000000001fffffffffffp+600"16532714232077090818ull},
      {"+0x1.000000000000200000000000p+600"7309342195222315010ull},
      {"-0x1.000000000000200000000000p+600"16532714232077090818ull},
      {"+0x1.000000000000200000000001p+600"7309342195222315010ull},
      {"-0x1.000000000000200000000001p+600"16532714232077090818ull},
      {"+0x1.00000000000027ffffffffffp+600"7309342195222315010ull},
      {"-0x1.00000000000027ffffffffffp+600"16532714232077090818ull},
      {"+0x1.000000000000280000000000p+600"7309342195222315010ull},
      {"-0x1.000000000000280000000000p+600"16532714232077090818ull},
      {"+0x1.000000000000280000000001p+600"7309342195222315011ull},
      {"-0x1.000000000000280000000001p+600"16532714232077090819ull},
      {"+0x2000000000000100000000000"5044031582654955520ull},
      {"-0x2000000000000100000000000"14267403619509731328ull},
      {"+0x2000000000000100000000001"5044031582654955521ull},
      {"-0x2000000000000100000000001"14267403619509731329ull},
      {"+0x20000000000001fffffffffff"5044031582654955521ull},
      {"-0x20000000000001fffffffffff"14267403619509731329ull},
      {"+0x2000000000000200000000000"5044031582654955521ull},
      {"-0x2000000000000200000000000"14267403619509731329ull},
      {"+0x2000000000000200000000001"5044031582654955521ull},
      {"-0x2000000000000200000000001"14267403619509731329ull},
      {"+0x20000000000002fffffffffff"5044031582654955521ull},
      {"-0x20000000000002fffffffffff"14267403619509731329ull},
      {"+0x2000000000000300000000000"5044031582654955522ull},
      {"-0x2000000000000300000000000"14267403619509731330ull},
      {"+0x2000000000000300000000001"5044031582654955522ull},
      {"-0x2000000000000300000000001"14267403619509731330ull},
      {"+0x20000000000003fffffffffff"5044031582654955522ull},
      {"-0x20000000000003fffffffffff"14267403619509731330ull},
      {"+0x2000000000000400000000000"5044031582654955522ull},
      {"-0x2000000000000400000000000"14267403619509731330ull},
      {"+0x2000000000000400000000001"5044031582654955522ull},
      {"-0x2000000000000400000000001"14267403619509731330ull},
      {"+0x20000000000004fffffffffff"5044031582654955522ull},
      {"-0x20000000000004fffffffffff"14267403619509731330ull},
      {"+0x2000000000000500000000000"5044031582654955522ull},
      {"-0x2000000000000500000000000"14267403619509731330ull},
      {"+0x2000000000000500000000001"5044031582654955523ull},
      {"-0x2000000000000500000000001"14267403619509731331ull},
      {"+0x0.000000000000080000000000p-1022"0ull},
      {"-0x0.000000000000080000000000p-1022"9223372036854775808ull},
      {"+0x0.000000000000080000000001p-1022"1ull},
      {"-0x0.000000000000080000000001p-1022"9223372036854775809ull},
      {"+0x0.0000000000000fffffffffffp-1022"1ull},
      {"-0x0.0000000000000fffffffffffp-1022"9223372036854775809ull},
      {"+0x0.000000000000100000000000p-1022"1ull},
      {"-0x0.000000000000100000000000p-1022"9223372036854775809ull},
      {"+0x0.000000000000100000000001p-1022"1ull},
      {"-0x0.000000000000100000000001p-1022"9223372036854775809ull},
      {"+0x0.00000000000017ffffffffffp-1022"1ull},
      {"-0x0.00000000000017ffffffffffp-1022"9223372036854775809ull},
      {"+0x0.000000000000180000000000p-1022"2ull},
      {"-0x0.000000000000180000000000p-1022"9223372036854775810ull},
      {"+0x0.000000000000180000000001p-1022"2ull},
      {"-0x0.000000000000180000000001p-1022"9223372036854775810ull},
      {"+0x0.0000000000001fffffffffffp-1022"2ull},
      {"-0x0.0000000000001fffffffffffp-1022"9223372036854775810ull},
      {"+0x0.000000000000200000000000p-1022"2ull},
      {"-0x0.000000000000200000000000p-1022"9223372036854775810ull},
      {"+0x0.000000000000200000000001p-1022"2ull},
      {"-0x0.000000000000200000000001p-1022"9223372036854775810ull},
      {"+0x0.00000000000027ffffffffffp-1022"2ull},
      {"-0x0.00000000000027ffffffffffp-1022"9223372036854775810ull},
      {"+0x0.000000000000280000000000p-1022"2ull},
      {"-0x0.000000000000280000000000p-1022"9223372036854775810ull},
      {"+0x1.000000000000280000000001p-1022"4503599627370499ull},
      {"-0x1.000000000000280000000001p-1022"9227875636482146307ull},
      {"+0x1.fffffffffffff4p1023"9218868437227405311ull},
      {"-0x1.fffffffffffff4p1023"18442240474082181119ull},
      {"+0x1.fffffffffffff7ffffffp1023"9218868437227405311ull},
      {"-0x1.fffffffffffff7ffffffp1023"18442240474082181119ull},
  };

  for (auto test : kTests) {
    AssertHexDoubleEquals(test.output, test.input);
  }
}

void AssertWriteUint128Equals(const v128& value, const std::string& expected) {
  assert(expected.length() < 128);
  char buffer[128];
  WriteUint128(buffer, 128, value);
  std::string actual(buffer, buffer + expected.length());
  ASSERT_EQ(expected, actual);
  ASSERT_EQ(buffer[expected.length()], '\0');
}

TEST(WriteUint128, Basic) {
  AssertWriteUint128Equals({0000}, "0");
  AssertWriteUint128Equals({1000}, "1");
  AssertWriteUint128Equals({0x100f0e0d, 0x0c0b0a09, 0x08070605, 0x04030201},
                           "5332529520247008778714484145835150861");
  AssertWriteUint128Equals({0x00112233, 0x44556677, 0x8899aabb, 0xccddeeff},
                           "272314856204801878456120017448021860915");
  AssertWriteUint128Equals({0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff},
                           "340282366920938463463374607431768211455");
  AssertWriteUint128Equals({0010}, "18446744073709551616");
}

TEST(WriteUint128, BufferTooSmall) {
  {
    char buffer[20];
    WriteUint128(buffer, 20, {0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff});
    ASSERT_EQ(buffer[19], '\0');
    std::string actual(buffer, buffer + 19);
    ASSERT_EQ("3402823669209384634", actual);
  }

  {
    char buffer[3];
    WriteUint128(buffer, 3, {123000});
    ASSERT_EQ(buffer[0], '1');
    ASSERT_EQ(buffer[1], '2');
    ASSERT_EQ(buffer[2], '\0');
  }
}

Messung V0.5 in Prozent
C=97 H=100 G=98

¤ Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.0.9Bemerkung:  ¤

*Bot Zugriff






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.