Phạm vi float Python

Bạn cần một cấp số cộng, giống như hàm tích hợp sẵn range, nhưng với giá trị float (range chỉ hoạt động trên số nguyên)

Mặc dù chức năng này không có sẵn dưới dạng tích hợp sẵn nhưng không khó để mã hóa nó bằng một vòng lặp

def frange(start, end=None, inc=1.0):
    "A range-like function that does accept float increments..."

    if end == None:
        end = start + 0.0     # Ensure a float value for 'end'
        start = 0.0
    assert inc                # sanity check

    L = []
    while 1:
        next = start + len(L) * inc
        if inc > 0 and next >= end:
            break
        elif inc < 0 and next <= end:
            break
        L.append(next)

    return L

Rất tiếc là thiếu thư viện chuẩn của Python, hàm trong công thức này cho phép bạn sử dụng các phạm vi, giống như với hàm tích hợp sẵn range, nhưng với các đối số float

Nhiều hạn chế về mặt lý thuyết được áp dụng, nhưng chức năng này hữu ích hơn trong thực tế so với lý thuyết. Những người luôn làm việc với các số dấu phẩy động có nhiều câu chuyện chiến tranh về các dự án hàng tỷ đô la đã thất bại vì ai đó đã không xem xét những điều kỳ lạ mà phần cứng hiện đại làm khi so sánh các số dấu phẩy động. Nhưng đối với các trường hợp dành cho người đi bộ, các cách tiếp cận đơn giản như công thức này thường hiệu quả

Bạn có thể tăng tốc độ đáng kể bằng cách phân bổ trước danh sách thay vì gọi liên tục append. Điều này cũng cho phép bạn loại bỏ các điều kiện trong vòng lặp bên trong. Đối với một yếu tố, phiên bản này hầu như không nhanh hơn, nhưng với hơn 10 yếu tố, phiên bản này luôn nhanh hơn khoảng 5 lần—loại tỷ lệ hiệu suất đáng để quan tâm. Tôi nhận được đầu ra giống hệt nhau cho mọi trường hợp thử nghiệm mà tôi có thể nghĩ ra

def frange2(start, end=None, inc=1.0):
    "A faster range-like function that does accept float increments..."
    if end == None:
        end = start + 0.0
        start = 0.0
    else: start += 0.0 # force it to be a float

    count = int((end - start) / inc)
    if start + count * inc != end:
        # Need to adjust the count. AFAICT, it always comes up one short.
        count += 1

    L = [start] * count
    for i in xrange(1, count):
        L[i] = start + i * inc

    return L

Cả hai phiên bản đều dựa vào một phép nhân và một phép cộng để tính toán từng mục, nhằm tránh tích lũy sai số do các phép cộng lặp đi lặp lại. Đây là lý do tại sao, ví dụ, phần thân của vòng lặp

def frange2(start, end=None, inc=1.0):
    "A faster range-like function that does accept float increments..."
    if end == None:
        end = start + 0.0
        start = 0.0
    else: start += 0.0 # force it to be a float

    count = int((end - start) / inc)
    if start + count * inc != end:
        # Need to adjust the count. AFAICT, it always comes up one short.
        count += 1

    L = [start] * count
    for i in xrange(1, count):
        L[i] = start + i * inc

    return L
0 trong
def frange2(start, end=None, inc=1.0):
    "A faster range-like function that does accept float increments..."
    if end == None:
        end = start + 0.0
        start = 0.0
    else: start += 0.0 # force it to be a float

    count = int((end - start) / inc)
    if start + count * inc != end:
        # Need to adjust the count. AFAICT, it always comes up one short.
        count += 1

    L = [start] * count
    for i in xrange(1, count):
        L[i] = start + i * inc

    return L
1 không

L[i] = L[i-1] + inc

Trong Python 2. 2, nếu tất cả những gì bạn cần làm là lặp lại kết quả của

def frange2(start, end=None, inc=1.0):
    "A faster range-like function that does accept float increments..."
    if end == None:
        end = start + 0.0
        start = 0.0
    else: start += 0.0 # force it to be a float

    count = int((end - start) / inc)
    if start + count * inc != end:
        # Need to adjust the count. AFAICT, it always comes up one short.
        count += 1

    L = [start] * count
    for i in xrange(1, count):
        L[i] = start + i * inc

    return L
0, bạn có thể tiết kiệm bộ nhớ bằng cách biến hàm này thành một trình tạo đơn giản, tạo ra một trình vòng lặp khi bạn gọi nó

from _ _future_ _ import generators

def frangei(start, end=None, inc=1.0):
    "An xrange-like simple generator that does accept float increments..."

    if end == None:
        end = start + 0.0
        start = 0.0
    assert inc                # sanity check

    i = 0
    while 1:
        next = start + i * inc
        if inc > 0 and next >= end:
            break
        elif inc < 0 and next <= end:
            break
        yield next
        i += 1

Nếu bạn sử dụng công thức này nhiều, có lẽ bạn nên xem Numeric Python và các gói của bên thứ ba khác coi trọng tính toán với các số dấu phẩy động. Ví dụ, công thức này sẽ không mở rộng tốt đến phạm vi rất lớn, trong khi những công thức được xác định trong Numeric Python sẽ

Chắc chắn, chúng tôi biết rằng các đối tượng phạm vi không chứa ký tự. Nhưng đó là quan điểm sai lầm. Bản thân lớp phạm vi biết gì?

Làm thế nào để lớp phạm vi đó biết rằng đối tượng đích không so sánh bằng một số int?

if isinstance(target, (str, list, tuple, dict, set)):
    raise TypeError
return any(target == x for x in self)

Và sau đó chúng tôi sẽ mãi mãi giải quyết các khiếu nại mà chúng tôi quên loại trừ lớp này, lớp kia. “Tại sao Không ai kích hoạt TypeError?”

Điều gì về byte, freezesets, Ellipsis, bộ sưu tập. deque, chức năng, mô-đun, v.v. v.v.?

Các đối tượng phạm vi là các chuỗi. Các chuỗi quay trở lại quá trình lặp lại và kiểm tra tính bằng nhau của từng phần tử đối với toán tử

def frange2(start, end=None, inc=1.0):
    "A faster range-like function that does accept float increments..."
    if end == None:
        end = start + 0.0
        start = 0.0
    else: start += 0.0 # force it to be a float

    count = int((end - start) / inc)
    if start + count * inc != end:
        # Need to adjust the count. AFAICT, it always comes up one short.
        count += 1

    L = [start] * count
    for i in xrange(1, count):
        L[i] = start + i * inc

    return L
2, bởi vì chuỗi không thể dự đoán đối tượng mục tiêu sẽ làm gì

Phạm vi float trong Python là gì?

Các giá trị float của Python được biểu thị dưới dạng các giá trị có độ chính xác kép 64 bit. Giá trị lớn nhất mà bất kỳ số dấu phẩy động nào cũng có thể đạt được là khoảng 1. 8 x 10 308.

Phạm vi cho loại float là gì?

Vì bit bậc cao của phần định trị luôn là 1 nên nó không được lưu trong số. Biểu diễn này đưa ra phạm vi xấp xỉ 3. 4E-38 đến 3. 4E+38 cho loại float.

Phạm vi của float 32 là gì?

Độ chính xác đơn 32 bit, với phạm vi xấp xỉ từ 10 -101 đến 10 90 and precision of 7 decimal digits. 64-bit double precision, with an approximate range of 10 -398 to 10 369 and precision of 16 decimal digits.

Phạm vi float với 64 bit là gì?

Số dấu phẩy động, độ chính xác kép là một số gần đúng 64 bit của một số thực. Số có thể bằng 0 hoặc có thể nằm trong khoảng từ -1. 797693134862315E+308 đến -2. 225073858507201E-308 hoặc từ 2. 225073858507201E-308 đến 1. 797693134862315E+308.