blob: 4638c4d3d3a58c9b7c4061b88ca81116cfbb9fe7 [file] [log] [blame]
# ===--- SwiftFloatingPointTypes.py ------------------*- coding: utf-8 -*-===//
#
# This source file is part of the Swift.org open source project
#
# Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
# Licensed under Apache License v2.0 with Runtime Library Exception
#
# See https://swift.org/LICENSE.txt for license information
# See https://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):
floatTy = floating_point_bits_to_type()[floatBits]
sigBits = floatTy.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, cFuncSuffix, significandBits, exponentBits,
significandSize, totalBits):
self.stdlib_name = name
self.cFuncSuffix = cFuncSuffix
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", cFuncSuffix="f", significandBits=23,
exponentBits=8, significandSize=32, totalBits=32),
64: SwiftFloatType(name="Double", cFuncSuffix="", significandBits=52,
exponentBits=11, significandSize=64, totalBits=64),
80: SwiftFloatType(name="Float80", cFuncSuffix="l", significandBits=63,
exponentBits=15, significandSize=64, totalBits=80),
}
def all_floating_point_types():
return floating_point_bits_to_type().values()