mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
49 lines
2.0 KiB
Python
49 lines
2.0 KiB
Python
# ===--- SwiftFloatingPointTypes.py ----------------------------*- coding: utf-8 -*-===//
|
|
#
|
|
# This source file is part of the Swift.org open source project
|
|
#
|
|
# Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
|
|
# Licensed under Apache License v2.0 with Runtime Library Exception
|
|
#
|
|
# See http://swift.org/LICENSE.txt for license information
|
|
# See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
|
|
# returns (lower, upper) exclusive bounds for the integer values
|
|
# that can be stored into a float
|
|
def getFtoIBounds(floatBits, intBits, signed):
|
|
sigBits = floating_point_bits_to_type()[floatBits].explicit_significand_bits
|
|
if not signed:
|
|
return (-1, 1 << intBits)
|
|
upper = 1 << (intBits - 1)
|
|
if intBits <= sigBits:
|
|
return (-upper - 1, upper)
|
|
ulp = 1 << (intBits - sigBits)
|
|
return (-upper - ulp, upper)
|
|
|
|
class SwiftFloatType(object):
|
|
|
|
def __init__(self, name, significandBits, exponentBits, significandSize, totalBits):
|
|
self.stdlib_name = name
|
|
self.significand_bits = significandBits
|
|
self.significand_size = significandSize
|
|
self.exponent_bits = exponentBits
|
|
self.explicit_significand_bits = significandBits + 1
|
|
self.bits = totalBits
|
|
|
|
|
|
def floating_point_bits_to_type():
|
|
return {
|
|
32: SwiftFloatType(name="Float", significandBits=23, exponentBits=8, significandSize=32, totalBits=32),
|
|
64: SwiftFloatType(name="Double", significandBits=52, exponentBits=11, significandSize=64, totalBits=64),
|
|
80: SwiftFloatType(name="Float80", significandBits=63, exponentBits=15, significandSize=64, totalBits=80),
|
|
}
|
|
|
|
def all_floating_point_types():
|
|
return floating_point_bits_to_type().values()
|
|
|
|
# // Bit counts for all floating point types.
|
|
# // 80-bit floating point types are only permitted on x86 architectures. This
|
|
# // restriction is handled via #if's in the generated code.
|
|
def all_floating_point_bits():
|
|
return floating_point_bits_to_type().keys()
|