Source code for seu_injection.bitops.float32_legacy

"""Legacy implementations of IEEE 754 Float32 bit manipulation operations.

This module contains educational and fallback implementations of bit-level manipulation functions for float32 values.
These functions prioritize clarity and compatibility over performance and are not intended for production use.
"""

from typing import Union

import numpy as np

from .utils import binary_to_float32, float32_to_binary


[docs] def bitflip_float32(x: Union[float, np.ndarray], bit_i: Union[int, None] = None) -> Union[float, np.ndarray]: """Flip a specific bit in IEEE 754 float32 values using string-based manipulation. Args: x (Union[float, np.ndarray]): Input float32 value or numpy array of values. bit_i (Optional[int]): Bit position to flip in IEEE 754 representation. Returns: Union[float, np.ndarray]: Value(s) with the specified bit flipped. Raises: ValueError: If bit_i is not in valid range [0, 31] when specified. TypeError: If input contains non-numeric values. """ if bit_i is None: bit_i = np.random.randint(0, 32) elif not (0 <= bit_i <= 31): raise ValueError(f"Bit position must be between 0 and 31, got {bit_i}") if hasattr(x, "__iter__"): x_ = np.zeros_like(x, dtype=np.float32) for i, item in enumerate(x): string = list(float32_to_binary(item)) string[bit_i] = "0" if string[bit_i] == "1" else "1" x_[i] = binary_to_float32("".join(string)) return x_ else: string = list(float32_to_binary(x)) string[bit_i] = "0" if string[bit_i] == "1" else "1" return binary_to_float32("".join(string))
def _bitflip_original_scalar(x: float, bit_i: int) -> float: """Original string-based scalar bitflip for compatibility fallback.""" string = list(float32_to_binary(x)) string[bit_i] = "0" if string[bit_i] == "1" else "1" return float(binary_to_float32("".join(string))) def _bitflip_original_array(x, bit_i: int) -> np.ndarray: """Original string-based array bitflip for compatibility fallback.""" x_ = np.zeros_like(x, dtype=np.float32) for i, item in enumerate(x): string = list(float32_to_binary(item)) string[bit_i] = "0" if string[bit_i] == "1" else "1" x_[i] = binary_to_float32("".join(string)) return x_